用位操作+BFS解決.基本思想如下:
給棋盤(pán)每一個(gè)狀態(tài)賦予一個(gè)狀態(tài)id,id計(jì)算方法是將棋盤(pán)與數(shù)的二進(jìn)制表示聯(lián)系起來(lái),如題所給的數(shù)據(jù):
bwwb
bbwb
bwwb
bwww
狀態(tài)id為6585,計(jì)算方法為1*2^0+0*2^1+1*2^2..1*2^12+0*2^13..=6585(其中b代表1,w代表0)
在此基礎(chǔ)上進(jìn)行BFS搜索,首先理解一點(diǎn),先點(diǎn)(0,0)再點(diǎn)(0,1)與先點(diǎn)(0,1)再點(diǎn)(0,0)對(duì)結(jié)果不造成任何影響.因此遍歷棋盤(pán)的16個(gè)位置,將每次點(diǎn)擊后的狀態(tài)id利用樹(shù)狀結(jié)構(gòu)保存.如:
6585
/ | \ ...
(0,0) (0,1) (0,2)
/ | \ ...
6568 6553 6646
...............................
對(duì)此樹(shù)進(jìn)行BFS搜索,將id為0(全白)或65535(全黑)的時(shí)候則搜索成功,輸出樹(shù)的高度,否則輸出"Impossible".
為了提高搜索效率,采用位運(yùn)算,如果想將整數(shù)的二進(jìn)制某一位翻轉(zhuǎn)可采用id^=(1<<x)(x代表要翻轉(zhuǎn)的位置)
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
posted on 2009-03-21 10:30
肖羽思 閱讀(5050)
評(píng)論(8) 編輯 收藏 引用 所屬分類(lèi):
POJ