noip提高組2011 mayan遊戲

2021-07-30 22:35:37 字數 2735 閱讀 9468

mayan puzzle是最近流行起來的乙個遊戲。遊戲介面是乙個7行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所示的局面。

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

接下來的5行,描述7*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

3s

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

資料規模如下:

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

對於100%的資料,0 < n ≤ 5。

這題主要難點不在搜尋,而在如何消除聯通的塊和讓快掉落,搜尋還是挺好寫的,還可以在搜的時候加個剪枝:若有一種顏色塊只有一或兩塊,直接return

#include #include #include #include using std :: swap;

int s[6][8],n;

struct t ans[6];

inline bool check(int tmp[6][8])

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

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

if (pd[i][j])

return flag;

}inline void down(int tmp[6][8])

}}void dfs(int tot,int map[6][8])

if (flag)

return;

} int cnt[11];

memset(cnt,0,sizeof(cnt));

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

for (int j = 0;j < 7;j++) cnt[map[i][j]]++; //統計每種顏色有多少塊

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

if (cnt[i] == 1 || cnt[i] == 2) return; //若不足三塊,直接return

for (int i = 0;i < 4;i++)

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

if (map[i][j] != map[i+1][j]) else

swap(tmp[i][j],tmp[i+1][j]); //交換

down(tmp); //掉落

while (check(tmp)) down(tmp); //消掉,然後掉落

dfs(tot+1,tmp); //下一步

}}int main()

} dfs(0,s);

printf("-1"); //無解輸出-1

return 0;

}

NOIP提高組2011 鋪地毯

題目 題目描述 為了準備乙個獨特的頒獎典禮,組織者在會場的一片矩形區域 可看做是平面直角座標系的第一象限 鋪上一些矩形地毯。一共有 n 張地毯,編號從 1 到n 現在將這些地毯按照編號從小到大的順序平行於座標軸先後鋪設,後鋪的地毯覆蓋在前面已經鋪好的地毯之上。地毯鋪設完成後,組織者想知道覆蓋地面某個...

noip2011提高組 計算係數

這個題第一眼 楊輝三角。其實還有個高大上的名字 叫。二項式定理 我才高一qaq 後面這個名字不知道啊 不過知道楊輝三角也夠了 1 1a 0 b 0 1 1 1a 1b 1 2 1 1a 2 2ab 1b 2 1 3 3 1 只不過這道題多了乙個x與y項的係數 無所謂 用整體思想 將ax看成u by看...

noip 2011 提高組 計算係數

給定乙個多項式 ax by k,請求出多項式展開後 x n y m 項的係數。保證n m k 共一行,包含 5 個整數,分別為a,b,k,n,m,每兩個整數之間用乙個空格隔開。輸出共 1 行,包含乙個整數,表示所求的係數,這個係數可能很大,輸出對10007 取模後的結果。輸入 1 1 3 1 2 輸...