NOIP Mayan遊戲 搜尋

2022-04-30 06:03:08 字數 3227 閱讀 4443

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。

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。

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 #include8

using

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,用乙個空格隔開...