廣搜 棋盤遊戲

2022-06-20 01:09:12 字數 1654 閱讀 9600

題目描述

在乙個4*4的棋盤上有8個黑棋和8個白棋,當且僅當兩個格仔有公共邊,這兩個格仔上的棋是相鄰的。移動棋子的規則是交換相鄰兩個棋子。現在給出乙個初始棋盤和乙個最終棋盤,要求你找出乙個最短的移動串行使初始棋盤變為最終棋盤。

klux說:「這麼簡單的題目,我都會做!」

輸入第1到4行每行四個數字(1或者0),描述了初始棋盤。

接著是乙個空行。

第6到9行每行四個數字,描述了最終棋盤。

輸出第一行是乙個整數n,表示最少的移動步數。

接下來n行每行4個數,r1,c1,r2,c2,表示移動的兩個棋子的座標(r1,c1),(r2,c2)(棋盤左上角的座標為(1,1),並且他右邊的格仔為(1,2))

如果有許多組解,你可以輸出任意一組。

1111

0000

1110

0010

1010

0101

1010

0101

樣例輸出
4

1 2 2 2

1 4 2 4

3 2 4 2

4 3 4 4

【題意】

交換即可,但是大家要這個狀態不好標記處理,所以我們需要hash處理,這個01矩陣,不難想到我們處理成二進位制來處理。

我們怎麼處理這個題目中1,0對應的位置呢???我們可以用我們二維陣列通用的hash方法,就是除以列寬得行號,對列寬取餘得到列號的做法。

」交換「:如何實現??

同樣地得到上下兩個座標的位置,同時其實他們對應的二進位制也是序號來記錄的,然後我們直接找到兩個位置,用異或處理就可以交換0和1的操作。

怎麼列印這個答案呢??

我認為這個題目還有一點就是記錄路徑的方法,記錄路徑是非常考驗人的,但是我們需要開乙個結構體,

這個結構體需要記錄這次hash值對應的哪兩個座標進行交換了,同時這個結構體能通過最終狀態的hash值回溯輸出。

【**】:

1 #include2

using

namespace

std;

3const

int n = (1

<<16)+10;4

intpre[n],vis[n];

5 typedef struct

node node ;

9node ans[n];

10int

n,m;

11void dfs(int

no)16

void

bfs()41}

42}43}

44//

左右互換

45for(int i=0;i<=15;i++)64}

65}66}

67}68}

69int

main()

7075

for(int i=0,x;i<16;i++)

79if ( n==m )else

84return0;

85}8687

/*88

891111

900000

911110

920010

9394

1010

950101

961010

970101

9899

*/

棋盤遊戲

馬踏棋盤(簡單廣搜)

49557 nwpu 2014 trn 4 搜尋c題 題目 給定乙個8 8的棋盤,然後給定棋子馬的初始位置和目標位置,求算出從初始位置到目標位置,所需要的最短步數。include include using namespace std int main h wh0.first 1 w wh0.sec...

Leetcode 廣搜 深搜 掃雷遊戲(529)

讓我們一起來玩掃雷遊戲!給定乙個代表遊戲板的二維字元矩陣。m 代表乙個未挖出的地雷,e 代表乙個未挖出的空方塊,b 代表沒有相鄰 上,下,左,右,和所有4個對角線 地雷的已挖出的空白方塊,數字 1 到 8 表示有多少地雷與這塊已挖出的方塊相鄰,x 則表示乙個已挖出的地雷。如果乙個地雷 m 被挖出,遊...

廣搜 移動棋盤 二進位制

題目描述 在乙個4 4的棋盤上有8個黑棋和 8個白棋,當且僅當兩個格仔有公共邊,這兩個格仔上的棋是相鄰的。移動棋子的規則是交換相鄰兩個棋子。給出乙個初始棋盤和乙個最終棋盤,請找出乙個最短的移動串行使初始棋盤變為最終棋盤。輸入格式 前四行,每行 4個數字 1或者0 描述了初始棋盤 接著是乙個空行 第六...