mayan puzzle是最近流行起來的乙個遊戲。遊戲介面是乙個7行5列的棋盤,上面堆放著一些方塊,方塊不能懸空堆放,即方塊必須放在最下面一行,或者放在其他方塊之上。遊戲通關是指在規定的步數內消除所有的方塊,消除方塊的規則如下:
1、每步移動可以且僅可以沿橫向(即向左或向右)拖動某一方塊一格:當拖動這一方塊時,如果拖動後到達的位置(以下稱目標位置)也有方塊,那麼這兩個方塊將交換位置(參見圖6到圖7);如果目標位置上沒有方塊,那麼被拖動的方塊將從原來的豎列中抽出,並從目標位置上掉落(直到不懸空,參見圖1和圖2);
2、任一時刻,如果在一橫行或者豎列上有連續三個或者三個以上相同顏色的方塊,則它們將立即被消除(參見圖1到圖3)。
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。
31 02 1 0
2 3 4 0
3 1 0
2 4 3 4 0
3s2 1 13 1 1
3 0 1
樣例輸入的遊戲局面如圖6到圖11所示。依次移動的三步是:(2,1)處的方格向右移動,(3,1)處的方格向右移動,(3,0)處的方格向右移動,最後可以將棋盤上所有方塊消除。
資料規模如下:
對於30%的資料,初始棋盤上的方塊都在棋盤的最下面一行;
對於100%的資料,0 < n ≤ 5。
noip2011提高組day1第三題
(**:
題目意思應該還是很容易懂。首先是資料範圍小,限時長,所以很可能是搜尋。仔細想以後發現也不太可能是狀壓
dp之類的,就開始來思考搜尋。
首先思考深搜還是廣搜。因為一是字典序最小,而是儲存的量比較大都至少是乙個5 * 7的陣列或是5個vector
所以深搜的速度會稍微快一些(廣蒐會把一層都搜完才會擴充套件),記憶體開銷也會小很多
接下來開始思考剪枝,有下面幾種方案
1)因為是字典序最小,所以當左邊有方塊的時候從右向左移動不如從左向右移動(減去將近一半的節點)
2)源方塊和目標方塊顏色一樣不需要移動,因為原來的影象看起來並沒有改變
3)一種顏色剩餘的數量大於0但是不足3個,返回
剪枝思考完畢了後,接下來是這個遊戲特有的一些部分
1)下落,這個比較簡單,就不多說了,看**
2)消除,消除可以先標記,並不是直接消除,另外定乙個5 * 7的陣列,當某一位需要消除時將對應位上標為1
另外為了快捷可以3個單位地判斷是否可以消除,另外在消除時還要加乙個返回值判斷是否消除了方塊,因為消除完有
方塊下落仍然會肯能產生消除,例如:
綠色消除後變成
最後紅色的塊也被消除
1 #include2 #include3 #include4 #include5 #include6 #include7 #include8using
namespace
std;
9 typedef bool
boolean;
10 template11 inline void readinteger(t&u)
17 typedef class
gameobject
25void
fallingdown()34}
35 status[i] =c;36}
37}38boolean clean()47}
48}4950
for(int i = 0; i < 7; i++)56}
57}5859
for(int i = 0; i < 5; i++)65}
66}67return
aflag;68}
69 boolean move(int x, int y, int
direc)
79int
size()
85int* operator (int
pos)
88}gameobject;
89int
n;90
gameobject starter;
91const
int mover[2] = ;
92 inline void
init()
100}
101}
102int x[6
];103
int y[6
];104
int d[6
];105
void search(gameobject status, int
depth)
111 exit(0
);112
}113
114for(int i = 0; i < 5; i++)
124}
125}
126}
127}
128int
main()
搜尋 傳球遊戲
時間限制 1 sec 記憶體限制 50 mb 提交 28 解決 16 提交 狀態 討論版 命題人 外部匯入 上體育課的時候,小蠻的老師經常帶著同學們一起做遊戲。這次,老師帶著同學們一起做傳球遊戲。遊戲規則是這樣的 n個同學站成乙個圓圈,其中的乙個同學手裡拿著乙個球,當老師吹哨子時開始傳球,每個同學可...
字母遊戲(搜尋)
時間限制 10 sec 記憶體限制 64 mb 提交 28 解決 17 提交 狀態 討論版 命題人 外部匯入 題目描述 一種單人玩的遊戲,規則為 在乙個r行c列的方格上,每個方格中有乙個a z的字母。遊戲從左上角 第一行,第一列 位置開始,一步一步地向相鄰 上 下 左 右 方格移動。唯一的限制是路徑...
棋盤遊戲,dfs搜尋
問題描述 在乙個給定形狀的棋盤 形狀可能是不規則的 上面擺放棋子,棋子沒有區別。要求擺放時任意的兩個棋子不能放在棋盤中的同一行或者同一列,請程式設計求解對於給定形狀和大小的棋盤,擺放k個棋子的所有可行的擺放方案c。input 輸入含有多組測試資料。每組資料的第一行是兩個正整數,n k,用乙個空格隔開...