NOIP2011 提高組 Mayan
【解題思路】
因為時限為3秒,則考慮用搜尋。因為狀態數較多,明顯用BFS會爆,所以可以用DFS。剪枝的幾個地方:
1.一個格向左移動,等於它左邊的格向右移動,因此我們只要列舉每個格子向右移動便可。
2.若要調轉的兩個格子相同,則不調
3.若當前狀態某個顏色的數量小於3且不為0,那顯然這種顏色不可能被消除,則退出。
(編出的程式碼90,最後一個點超時,是在RNQOJ上測;我上網找過許多程式碼,放到RNQOJ上面,還沒有能AC的)
【程式碼】(望能幫忙找一下超時原因)
#include<iostream>
#include<cstdio>
#include<cmath>
#include<algorithm>
#include<cstring>
using namespace std;
int n;
struct node{
int x,y,p;
}s[10];
inline bool checkclear(int m[5][10])
{
for (int i=0;i<5;i++)
if (m[i][0]!=0) return 0;
return 1;
}
inline void print()
{
for (int i=0;i<n;i++)
printf("%d %d %d\n",s[i].x,s[i].y,s[i].p);
}
bool clearm(int tmp[5][10])
{
bool f=0,fl[5][10]={0};
for (int i=0;i<5;i++)
for (int j=0;j<5;j++)
if ((tmp[i][j]!=0)&&(tmp[i][j]==tmp[i][j+1])&&(tmp[i][j+1]==tmp[i][j+2]))
fl[i][j]=fl[i][j+1]=fl[i][j+2]=1;
for (int i=0;i<3;i++)
for (int j=0;j<7;j++)
if ((tmp[i][j]!=0)&&(tmp[i][j]==tmp[i+1][j])&&(tmp[i+1][j]==tmp[i+2][j]))
fl[i][j]=fl[i+1][j]=fl[i+2][j]=1;
for (int i=0;i<5;i++)
for (int j=0;j<7;j++)
{
if (fl[i][j])
{
f=1;
tmp[i][j]=0;
}
}
return f;
}
void drop(int tmp[5][10])
{
for (int i=0;i<5;i++)
for (int j=1;j<7;j++)
if ((tmp[i][j]!=0)&&(tmp[i][j-1]==0))
{
int p=j-1;
while ((p>=0)&&(tmp[i][p]==0))
{
swap(tmp[i][p+1],tmp[i][p]);
p--;
}
}
}
bool checkcolor(int m[5][10])
{
bool fl=1;
int sum[15]={0};
for (int i=0;i<5;i++)
for (int j=0;j<7;j++)
sum[m[i][j]]++;
for (int i=1;i<15;i++)
if ((sum[i]==1)||(sum[i]==2)) return 0;
return 1;
}
void dfs(int step,int m[5][10],int p,int q)
{
if (step==n)
{
if (checkclear(m))
{
print();
exit(0);
}
return;
}
if (!checkcolor(m)) return;
for (int i=0;i<4;i++)
{
for (int j=0;j<7;j++)
{
int tmp[5][10]={0};
memcpy(tmp,m,sizeof(tmp));
if (tmp[i][j]==tmp[i+1][j]) continue;
if (tmp[i][j]!=0)
{
s[step].x=i;
s[step].y=j;
s[step].p=1;
}else
{
s[step].x=i+1;
s[step].y=j;
s[step].p=-1;
}
swap(tmp[i][j],tmp[i+1][j]);
drop(tmp);
bool tf=0;
while (clearm(tmp))
{
drop(tmp);
tf=1;
}
if ((tf==0)&&(p==i)&&(q==j)) continue;
dfs(step+1,tmp,i,j);
}
}
}
int main()
{
scanf("%d",&n);
int m[5][10]={0};
for (int i=0;i<=4;i++)
{
int c=0,tmp;
while ((scanf("%d",&tmp)!=EOF)&&(tmp!=0))
m[i][c++]=tmp;
}
dfs(0,m,-1,-1);
printf("-1\n");
return 0;
}
相關文章
- [NOIP2011 提高組] 聰明的質檢員
- NOIP2011提高組初賽不定項選擇第5題
- [題解]P1311 [NOIP2011 提高組] 選擇客棧
- P1314 [NOIP2011 提高組] 聰明的質監員
- 洛谷P1003 [NOIP2011提高組] 鋪地毯 視訊題解
- 提高組雜題訓練1
- 提高組專題 dp4
- 【比賽】CSP提高組模擬1
- CSP歷年複賽題-P1309 [NOIP2011 普及組] 瑞士輪
- 逐月資訊學 2024 提高組 #1
- 2024初秋集訓——提高組 #29
- 2024初秋集訓——提高組 #32
- 2024初秋集訓——提高組 #34
- 2024初秋集訓——提高組 #35
- 2024初秋集訓——提高組 #40
- 逐月資訊學 2024 提高組 #2
- [NOIP2018 提高組] 旅行
- CSP歷年複賽題-P1310 [NOIP2011 普及組] 表示式的值
- 專案組織——比較而後提高(轉)
- [NOIP2015 提高組] 子串
- 1828:【02NOIP提高組】均分紙牌
- CSP歷年複賽題-P1308 [NOIP2011 普及組] 統計單詞數
- 題解--NOIP提高組2004 合併果子
- 【NOIP2011模擬11.1】釣魚
- CCF CSP-S 2024 提高組初賽解析
- CSP-S/NOIP提高組 真題題解總結
- P3959 [NOIP2017 提高組] 寶藏
- 逐月資訊學——2024初秋集訓——提高組 #22
- NOIP 提高組第一式第一題——玩具迷題
- 重慶強校模擬賽,提高組堪比省賽
- 【MX-S3】夢熊周賽 · 提高組 3 & FeOI Round 1S3
- Java提高篇(二):IO位元組流、字元流和處理流Java字元
- BF的資料結構題單-提高組——樹鏈剖分資料結構
- 2020.10.31【NOIP提高A組】模擬總結
- Python奇技淫巧—[2]—使用元組代替字典,同時為元組元素命名,提高可讀性Python
- Jzoj5459【NOIP2017提高A組衝刺11.7】密室
- 為元組中的每個元素命名,提高程式可讀性
- 1043 方格取數 2000年NOIP全國聯賽提高組