鐢ㄤ綅鎿嶄綔+BFS瑙e喅.鍩烘湰鎬濇兂濡備笅:
緇欐鐩樻瘡涓涓姸鎬佽祴浜堜竴涓姸鎬乮d,id璁$畻鏂規(guī)硶鏄皢媯嬬洏涓庢暟鐨勪簩榪涘埗琛ㄧず鑱旂郴璧鋒潵,濡傞鎵緇欑殑鏁版嵁:
bwwb
bbwb
bwwb
bwww
鐘舵乮d涓?585,璁$畻鏂規(guī)硶涓?*2^0+0*2^1+1*2^2..1*2^12+0*2^13..=6585(鍏朵腑b浠h〃1,w浠h〃0)
鍦ㄦ鍩虹涓婅繘琛孊FS鎼滅儲(chǔ),棣栧厛鐞嗚В涓鐐?鍏堢偣(0,0)鍐嶇偣(0,1)涓庡厛鐐?0,1)鍐嶇偣(0,0)瀵圭粨鏋滀笉閫犳垚浠諱綍褰卞搷.鍥犳閬嶅巻媯嬬洏鐨?6涓綅緗?灝嗘瘡嬈$偣鍑誨悗鐨勭姸鎬乮d鍒╃敤鏍?wèi)鐘毒l撴瀯淇濆瓨.濡?
6585
/ | \ ...
(0,0) (0,1) (0,2)
/ | \ ...
6568 6553 6646
...............................
瀵規(guī)鏍?wèi)杩涜BFS鎼滅儲(chǔ),灝唅d涓?(鍏ㄧ櫧)鎴?5535(鍏ㄩ粦)鐨勬椂鍊欏垯鎼滅儲(chǔ)鎴愬姛,杈撳嚭鏍?wèi)鐨勯珮搴?鍚﹀垯杈撳嚭"Impossible".
涓轟簡(jiǎn)鎻愰珮鎼滅儲(chǔ)鏁堢巼,閲囩敤浣嶈繍綆?濡傛灉鎯沖皢鏁存暟鐨勪簩榪涘埗鏌愪竴浣嶇炕杞彲閲囩敤id^=(1<<x)(x浠h〃瑕佺炕杞殑浣嶇疆)
1 #include "assert.h"
2 #include <iostream>
3 #include <queue>
4 using namespace std;
5
6 const int MAX_STATE = 65536;
7 const int ALL_WHILE_STATE = 0;
8 const int ALL_BLACK_STATE = 65535;
9 const int WIDTH_OF_BOARD = 4;
10 const int SIZE_OF_BOARD = WIDTH_OF_BOARD * WIDTH_OF_BOARD; // 4 * 4
11
12 int ConvertPieceColorToInt(char color)
13 {
14 switch(color)
15 {
16 case 'b':
17 return 1;
18 case 'w':
19 return 0;
20 }
21 }
22
23 int FlipPiece(int state_id, int position)
24 {
25 state_id ^= (1 << position);
26
27 // up
28 if(position - 4 >= 0)
29 state_id ^= (1 << (position - 4));
30 // down
31 if(position + 4 < SIZE_OF_BOARD)
32 state_id ^= (1 << (position + 4));
33 // left
34 if(position % 4 != 0)
35 state_id ^= (1 << (position - 1));
36 // right
37 if(position % 4 != 3)
38 state_id ^= (1 << (position + 1));
39
40 return state_id;
41 }
42
43 int _tmain(int argc, _TCHAR* argv[])
44 {
45 int current_state_id = 0;
46 int state[MAX_STATE];
47 queue<int> search_queue;
48
49 memset(state, -1, sizeof(state));
50
51 char color;
52
53 for(int i = 0; i < SIZE_OF_BOARD; ++i)
54 {
55 cin >> color;
56 current_state_id += ConvertPieceColorToInt(color) << i;
57 }
58
59 if(current_state_id == ALL_WHILE_STATE
60 || current_state_id == ALL_BLACK_STATE)
61 {
62 cout << "0" << endl;
63 return 0;
64 }
65
66 state[current_state_id] = 0;
67 search_queue.push(current_state_id);
68
69 int next_state_id;
70
71 while(!search_queue.empty())
72 {
73 current_state_id = search_queue.front();
74 search_queue.pop();
75
76 for(int i = 0; i < SIZE_OF_BOARD; ++i)
77 {
78 next_state_id = FlipPiece(current_state_id, i);
79 if(next_state_id == ALL_WHILE_STATE
80 || next_state_id == ALL_BLACK_STATE)
81 {
82 cout << state[current_state_id] + 1 << endl;
83 return 0;
84 }
85 assert(next_state_id < MAX_STATE);
86 if(state[next_state_id] == -1 /* not visited */)
87 {
88 state[next_state_id] = state[current_state_id] + 1;
89 search_queue.push(next_state_id);
90 }
91 }
92 }
93
94 cout << "Impossible" << endl;
95 return 0;
96 }
97
98

]]>