題目描述
在乙個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 描述了初始棋盤 接著是乙個空行 第六...