NOIP2011提高組 Mayan遊戲

2022-05-19 10:00:28 字數 1540 閱讀 3877

題目:洛谷p1312、vijos p1738、codevs1136。

題目大意:在乙個7行5列的棋盤(左下角座標0,0)上,有一些不同顏色的棋子。

規定某一時刻,連續三個橫排或豎列的棋子顏色相同,則它們被消掉(同時滿足條件的一起消掉,存在多個這樣的情況有公共棋子時,所有的都消掉)。

然後有一種操作:

將乙個棋子往左/右移動或和左邊/右邊的棋子交換。(左為-1,右為1)

規定棋盤上沒有棋子時,遊戲勝利。

現在給出順時針旋轉$90^\circ$後的棋盤,你要進行恰好n次操作,使遊戲勝利,輸出字典序最小(橫座標最小,然後縱座標最小,然後方向最小,1比-1小)的操作方案。

如果不可能,輸出-1。

解題思路:看到這麼小的資料範圍($n\leq 5$),肯定想到暴搜,而好像也沒有別的方法。

題目要求字典序最小,那我們就按字典序最小的方案搜,找到就輸出結束程式。

這裡有一些剪枝:

①當一種顏色的個數為1或2時,一定不可能勝利,跳出。

②搜的時候,先搜往右的,如果當前棋子和右邊棋子顏色相同,就不搜。

③搜左邊時,只考慮左邊為空的情況,如果不為空,則等價於左邊的棋子向右交換的操作,字典序更小,因此一定不可能為答案。

消除的情況,可以列舉中間點,然後判斷三個是否相同即可。

掉下來的情況,暴力移動即可。

剩下的,只需注意狀態的儲存和還原就行了。

別的沒什麼技巧可言。

c++ code:

#include#include#includeint n;

int bl[9][9],tong[12]=,ansx[7],ansy[7],yd[7];

bool bj[9][9];

void clean()

memset(bj,0,sizeof bj);

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

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

if(hasqc) }}

void dfs(int now)

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

if(tong[i]&&tong[i]<3)return;

int ylzt[9][9],yltong[12];

for(int i=0;i<9;++i)for(int j=0;j<9;++j)

ylzt[i][j]=bl[i][j];

memcpy(yltong,tong,sizeof tong);

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

if(i&&!ylzt[i-1][j])

} }for(int i=0;i<9;++i)for(int j=0;j<9;++j)

bl[i][j]=ylzt[i][j];

memcpy(tong,yltong,sizeof tong);

}int main()

} dfs(1);

puts("-1");

return 0;

}

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 輸...

NOIP2011提高組 Mayan遊戲

mayan puzzle是最近流行起來的乙個遊戲。遊戲介面是乙個 7 行5 列的棋盤,上面堆放著一些方塊,方塊不能懸空堆放,即方塊必須放在最下面一行,或者放在其他方塊之上。遊戲通關是指在規定的步數內消除所有的方塊,消除方塊的規則如下 1 每步移動可以且僅可以沿橫向 即向左或向右 拖動某一方塊一格 當...