3 bbwbwbwbw bwwwbwbwb bbbbwbbbw
2459 267 356789
本題主要考察廣度搜索方法的應用。首先,注意到本題是操做次數(即生成圖的邊)最重要,其次纔是頂點順序,那麼就要採用以邊爲搜索線索的廣度搜索,而非深搜,深搜會WA。 node
另外,本題最好採用二進制表示棋盤狀態,操做簡便並且節省運行時間,代碼也更簡潔,而9種操做對應的是當前狀態數和特定數字的異或。另外,狀態矩陣是必需的,否則可能會超時。 ios
PS:此題天雷滾滾的地方是,答案必需是1-9的數字,也就是說輸入是wwwwwwwww的時候,輸出應該是11,卡了我很長時間才搞對。 spa
// Problem#: 1048 // Submission#: 1853201 // The source code is licensed under Creative Commons Attribution-NonCommercial-ShareAlike 3.0 Unported License // URI: http://creativecommons.org/licenses/by-nc-sa/3.0/ // All Copyright reserved by Informatic Lab of Sun Yat-sen University #include <iostream> #include <string> #include <queue> #include <cstring> using namespace std; #define END 0 struct node{ int v; string f; node( int n ){ v = n; f = ""; } node( int n, string s ){ v = n; f = s; } }; int field[10]={0,432,504,216,438,511,219,54,63,27}; bool visit[1<<9]; inline int toi( string s ){ int re = 0; for( int i=0 ; i<9 ; i++ ){ re <<= 1; re |= s[i]=='b' ? 1 : 0 ; } return re; } void bfs( int a ){ queue<node> buffer; buffer.push(node(a)); visit[a] = true; while( !buffer.empty() ){ node temp = buffer.front(); buffer.pop(); if( temp.v==END ){ cout << temp.f << endl; return ; } for( int i=1 ; i<=9 ; i++ ){ int t = temp.v^field[i]; if( !visit[t] ){ visit[t] = true; string s = temp.f; s += '0'+i; buffer.push(node(t,s)); } } } } int main(){ int n; string str; int start; cin >> n; while( n-- ){ cin >> str; start = toi(str); memset(visit,false,sizeof(visit)); if( start==0 ) cout << 11 << endl; else bfs(start); } return 0; }