Eight II HDU
阿新 • • 發佈:2018-12-16
#include<iostream> #include<queue> #include<cstring> #include<string> #include<vector> using namespace std; struct node { int pre; int op; int x; int y; }; node path[10][370000]; string ps[370000]; int vis[10][370000]; int dir[4][2] = {{-1,0},{0,1},{0,-1},{1,0}}; char ss[4] = { 'u','r','l','d'}; int fac[] = {1,1,2,6,24,120,720,5040,40320,362880}; //i的階乘為fac[i] int Cantor(string s){ int sum = 0; for(int i = 0; i < 9; i++){ int num = 0; for(int j = i+1; j < 9; j++){ if(s[j] < s[i]) num++;//確定當前元素i在未出現的元素中是第幾個(從小到大) } sum += fac[8-i] * num; } return sum; } void bfs(int pathi,string inits,int initx,int inity) { for(int i=0;i<380000;i++)vis[pathi][i] =-1; int counts =0; path[pathi][counts].pre = -1; ps[counts] = inits; path[pathi][counts].x=initx; path[pathi][counts].y=inity; queue<int> qu; qu.push(counts); int visn; visn = Cantor(ps[counts]); vis[pathi][visn] =counts; counts++; while(!qu.empty()) { int f = qu.front(); //cout<<f<<" "<<ps[f]<<endl; qu.pop(); //cout<<f<<" "<<path[pathi][f].op<<" "<<ps[f]<<endl; int x = path[pathi][f].x; int y = path[pathi][f].y; char tp; for(int i=0;i<4;i++) { int px = x+dir[i][0]; int py = y+dir[i][1]; if(px<0||px>2||py<0||py>2)continue; tp = ps[f][px*3+py]; // 開始轉換 ps[f][px*3+py] = ps[f][x*3+y]; ps[f][x*3+y] = tp; visn = Cantor(ps[f]); //判斷是否出現過 if(vis[pathi][visn]!=-1) { tp = ps[f][px*3+py]; // 開始轉換 ps[f][px*3+py] = ps[f][x*3+y]; ps[f][x*3+y] = tp; continue; } vis[pathi][visn] =counts; path[pathi][counts].op = i; path[pathi][counts].pre = f; ps[counts] = ps[f]; path[pathi][counts].x = px; path[pathi][counts].y = py; qu.push(counts); counts++; tp = ps[f][px*3+py]; // 開始轉換 ps[f][px*3+py] = ps[f][x*3+y]; ps[f][x*3+y] = tp; } } } int main() { int nmap[10]; //bfs(int pathi,string inits,int initx,int inity); bfs(0,"012345678",0,0); bfs(1,"102345678",0,1); bfs(2,"120345678",0,2); bfs(3,"123045678",1,0); bfs(4,"123405678",1,1); bfs(5,"123450678",1,2); bfs(6,"123456078",2,0); bfs(7,"123456708",2,1); bfs(7,"123456708",2,1); bfs(8,"123456780",2,2); int t; string st; string en; ios::sync_with_stdio(false); //cout<<"dede"<<endl; cin>>t; for(int ppt=1;ppt<=t;ppt++) { cin>>st; cin>>en; int posx; int px=1; for(int i=0;i<9;i++) { if(st[i]=='X') { posx=i; continue; } nmap[st[i]-'0'] = px; px++; } for(int i=0;i<9;i++) { // cout<<i<<" "; if(en[i]=='X') { en[i] ='0'; } else en[i] = nmap[en[i]-'0'] + '0'; // cout<<en[i]<<endl; } //cout<<st<<" "<<en<<endl; //cout<<posx<<endl; int viss; viss = Cantor(en); vector<char> re1; if(vis[posx][viss] !=-1) { viss = vis[posx][viss]; //獲取該點的下標 //cout<<"vis =" <<vis<<endl; while(path[posx][viss].pre!=-1) { re1.push_back(ss[path[posx][viss].op]); viss = path[posx][viss].pre; } cout<<"Case "<<ppt<<": "<<re1.size()<<endl; for(int i = re1.size()-1;i>=0;i--)cout<<re1[i]; cout<<endl; } } return 0; }
http://www.voidcn.com/article/p-bctlciua-bcx.html