题意是给出一个3*3的黑白网格,每点击其中一格就会使某些格子的颜色发生转变,求达到目标状态网格的操作。可用BFS搜索解答,用vector储存每次的操作
1 #include<bits/stdc++.h> 2 using namespace std; 3 4 struct Node{ 5 int num;//储存状态 6 vector<int> path;//储存操作 7 }; 8 int visit[600]; 9 int click(int i, int num){ 10 int tmp = 0; 11 switch(i){ 12 case 0:tmp = num ^ 432; break;//点击第0位,则0、1、3、4位取反,这里用异或实现,点击其他的同理 13 case 1:tmp = num ^ 504; break; 14 case 2:tmp = num ^ 216; break; 15 case 3:tmp = num ^ 438; break; 16 case 4:tmp = num ^ 511; break; 17 case 5:tmp = num ^ 219; break; 18 case 6:tmp = num ^ 54; break; 19 case 7:tmp = num ^ 63; break; 20 case 8:tmp = num ^ 27; break; 21 } 22 return tmp; 23 } 24 25 Node bfs(int n){ 26 queue<Node> q; 27 Node front; 28 front.num = n; 29 q.push(front); 30 while(!q.empty()){ 31 front = q.front(); q.pop(); 32 33 for(int i = 0; i < 9; i++){ 34 Node tmp = front; 35 tmp.num = click(i, front.num); 36 tmp.path.push_back(i+1); 37 38 if(tmp.num == 0) return tmp; 39 else{ 40 if(!visit[tmp.num]){ 41 q.push(tmp); 42 visit[tmp.num] = 1; 43 } 44 } 45 } 46 } 47 } 48 49 int main(){ 50 int n; 51 cin >> n; 52 while(n--){ 53 string s; 54 cin >> s; 55 int num = 0; 56 for(int i = 0; i < s.size(); i++){ 57 if(s[i] == 'b')num = 2*num + 1; 58 else if(s[i] == 'w') num = 2*num; 59 } 60 memset(visit, 0, sizeof(visit)); 61 visit[num] = 1; 62 Node tmp = bfs(num); 63 for(int i = 0; i < tmp.path.size(); i++){ 64 cout << tmp.path[i]; 65 } 66 cout << endl; 67 } 68 }