Luogu P1312 Mayan遊戲 搜尋

2022-05-20 02:35:03 字數 3737 閱讀 5249

p1312 mayan遊戲

mayan puzzle是最近流行起來的乙個遊戲。遊戲介面是乙個\(7\)行\(\times 5\)列的棋盤,上面堆放著一些方塊,方塊不能懸空堆放,即方塊必須放在最下面一行,或者放在其他方塊之上。遊戲通關是指在規定的步數內消除所有的方塊,消除方塊的規則如下:

1 、每步移動可以且僅可以沿橫向(即向左或向右)拖動某一方塊一格:當拖動這一方塊時,如果拖動後到達的位置(以下稱目標位置)也有方塊,那麼這兩個方塊將交換位置(參見輸入輸出樣例說明中的圖\(6\)到圖\(7\));如果目標位置上沒有方塊,那麼被拖動的方塊將從原來的豎列中抽出,並從目標位置上掉落(直到不懸空,參見下面圖\(1\)和圖\(2\));

2 、任一時刻,如果在一橫行或者豎列上有連續三個或者三個以上相同顏色的方塊,則它們將立即被消除(參見圖\(1\)到圖\(3\))。

注意:a) 如果同時有多組方塊滿足消除條件,幾組方塊會同時被消除(例如下面圖\(4\),三個顏色為\(1\)的方塊和三個顏色為\(2\)的方塊會同時被消除,最後剩下乙個顏色為\(2\)的方塊)。

b) 當出現行和列都滿足消除條件且行列共享某個方塊時,行和列上滿足消除條件的所有方塊會被同時消除(例如下面圖\(5\)所示的情形,\(5\)個方塊會同時被消除)。

3 、方塊消除之後,消除位置之上的方塊將掉落,掉落後可能會引起新的方塊消除。注意:掉落的過程中將不會有方塊的消除。

上面圖\(1\)到圖\(3\)給出了在棋盤上移動一塊方塊之後棋盤的變化。棋盤的左下角方塊的座標為\((0,0)\),將位於\((3, 3)\)的方塊向左移動之後,遊戲介面從圖\(1\)變成圖\(2\)所示的狀態,此時在一豎列上有連續三塊顏色為\(4\)的方塊,滿足消除條件,消除連續\(3\)塊顏色為\(4\)的方塊後,上方的顏色為\(3\)的方塊掉落,形成圖\(3\)所示的局面。

共\(6\)行。

第一行為乙個正整數\(n\),表示要求遊戲通關的步數。

接下來的\(5\)行,描述\(7 \times 5\)的遊戲介面。每行若干個整數,每兩個整數之間用乙個空格隔開,每行以乙個\(0\)結束,自下向上表示每豎列方塊的顏色編號(顏色不多於\(10\)種,從\(1\)開始順序編號,相同數字表示相同顏色)。

輸入資料保證初始棋盤中沒有可以消除的方塊。

如果有解決方案,輸出\(n\)行,每行包含\(3\)個整數\(x,y,g\),表示一次移動,每兩個整數之間用乙個空格隔開,其中\((x,y)\)表示要移動的方塊的座標,\(g\)表示移動的方向,\(1\)表示向右移動,\(-1\)表示向左移動。注意:多組解時,按照\(x\)為第一關健字,\(y\)為第二關健字,\(1\)優先於\(-1\),給出一組字典序最小的解。遊戲介面左下角的座標為\((0,0)\)。

如果沒有解決方案,輸出一行,包含乙個整數\(-1\)。

3

1 02 1 0

2 3 4 0

3 1 0

2 4 3 4 0

2 1 1

3 1 1

3 0 1

【輸入輸出樣例說明】

按箭頭方向的順序分別為圖\(6\)到圖\(11\)。

樣例輸入的遊戲局面如上面第乙個所示,依次移動的三步是:\((2,1)\)處的方格向右移動,\((3,1)\)處的方格向右移動,\((3,0)\)處的方格向右移動,最後可以將棋盤上所有方塊消除。

【資料範圍】

對於\(30 \%\)的資料,初始棋盤上的方塊都在棋盤的最下面一行;

對於\(100 \%\)的資料,\(0。

\(noip2011\)提高組\(day1\)第\(3\)題

哪個**出的毒瘤題! --jmercury

(偷笑)。 --uranus

其實直接暴搜就好啦!之前開這道題的時候用的\(bfs\),然後據愉快地因為\(stl\)的一點也不優秀的時間和空間掛掉了。

其實\(dfs\)也並不難寫,這題也並不難。做這樣的題的技巧就是多寫函式,方便除錯,比如說自由落體(下落)操作,我們可以寫乙個函式:

inline void fall()}}

還有判斷有沒有能消除的方塊的函式,我們把它分成兩個來寫:

inline void judge(int x,int y)//判斷單點有沒有三聯通

總起來,每次判斷當前局面就可以這樣:

然後還要加上兩個小剪枝:

如果當前有某種顏色的方塊的塊數小於\(3\),那它們怎麼都消不掉了,當前局面不可行。

如果當前方塊的左邊不為空,就不向左移動。試想,兩個左右相鄰的方塊\(x,y\),對\(x\)的右移和對\(y\)的左移的作用是相同的,但前者的優先順序更高。所以只有當乙個方塊的左邊沒有方塊時,左移操作才是有意義的。

那麼用上這樣優秀的寫法,我們就能順利\(ac\)了。

#includeusing namespace std;

int n,g[5][7],sum[11];

bool vis[5][7];

stacks;

inline int read()

inline void fall()

}}inline void judge(int x,int y)

bool dfs(int step)

memset(sum,0,sizeof sum);

for(register int i=0;i<5;i++)

for(register int j=0;j<7;j++)

if(g[i][j]) sum[g[i][j]]++;

else break;

for(register int i=1;i<=10;i++)

if(sum[i]&&sum[i]<3)

return false;

int pre[5][7];

for(register int i=0;i<5;i++)

for(register int j=0;j<7;j++)

pre[i][j]=g[i][j];

for(register int i=0;i<5;i++)

for(register int j=0;j<7;j++)

for(register int ii=0;ii<5;ii++)

for(register int jj=0;jj<7;jj++)

g[ii][jj]=pre[ii][jj];

}if(i>=1&&!g[i-1][j])

for(register int ii=0;ii<5;ii++)

for(register int jj=0;jj<7;jj++)

g[ii][jj]=pre[ii][jj];}}

return false;

}int main()

for(register int i=1;i<=10;i++)

if(sum[i]&&sum[i]<3)

if(dfs(0))

}else printf("-1");

return 0;

}

Luogu P1312Mayan遊戲(暴搜)

題目鏈結 由於是暴搜題,所以這篇部落格只講怎麼優化剪枝,以及一些細節。模擬消除思路 因為消除可以拆分成小的橫條或豎條,而這些條的長度至少為三,所以一塊可消除的區域至少會有乙個中心點。這裡的中心點可以不在正中間,只需要不是條上的第乙個或者最後乙個。於是列舉中間點,搜尋它為中心最多向四個方向能擴充套件多...

洛谷P1312 Mayan遊戲

題目描述 見鏈結 解析 直接模擬和搜尋即可,注意儲存好資料,防止回溯時丟失。mayan遊戲 乙個模擬程度大於搜尋的搜尋題 大體模擬過程 移動 下降 消除 repeat 到達規定步數判斷是否消除完 具體剪枝方案luogu上的其他題解都說的比較清楚了。不過根據本 注釋也許可以更好理解一些 注意 此 中行...

洛谷 1312 Mayan遊戲(dfs)

在乙個7行5列的期盤中,有至多10種顏色的方塊。當這些方塊下方空的時候,這些方塊總是會垂直掉落 當有3個顏色相同的方塊排成一行或一列時,它們會被同時消除 你需要在給定的步數內,通過調換相鄰方塊,使棋盤上沒有方塊。若做不到,輸出 1 不然輸出1種方法 要移動的方塊的x y座標 移動方向 移動方向 1 ...