标签:
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 5970 Accepted Submission(s): 2666
#include<cstdio> #include<cstring> #include<algorithm> #include<math.h> #include<queue> #include<iostream> using namespace std; typedef long long LL; bool vis[10][10][10][10]; struct Node{ int v[4]; int step; }; Node s,t; bool _equal(Node a,Node b){ for(int i=0;i<4;i++){ if(a.v[i]!=b.v[i]) return false; } return true; } Node operate(int x,Node now){ Node next; for(int i=0;i<4;i++){ next.v[i] = now.v[i]; } next.step=now.step+1; if(x<4){ ///+ if(now.v[x]==9) next.v[x]=1; else next.v[x]=now.v[x]+1; }else if(x<8){ ///- if(now.v[x%4]==1) next.v[x%4]=9; else next.v[x%4]=now.v[x%4]-1; }else{ ///exchange int a = now.v[x%4]; int b = now.v[x%4+1]; next.v[x%4]=b; next.v[x%4+1] = a; } return next; } int bfs(Node s){ memset(vis,false,sizeof(vis)); queue <Node>q; vis[s.v[0]][s.v[1]][s.v[2]][s.v[3]]=true; q.push(s); s.step = 0; while(!q.empty()){ Node now = q.front(); q.pop(); if(_equal(now,t)){ return now.step; } for(int i=0;i<11;i++){ ///总共11种操作,[1-4]+ [1-4]- exwchange[1,2][2,3][3,4] Node next=operate(i,now); if(vis[next.v[0]][next.v[1]][next.v[2]][next.v[3]]==false){ vis[next.v[0]][next.v[1]][next.v[2]][next.v[3]]=true; q.push(next); } } } return -1; } int main() { char s1[5],s2[5]; int tcase; scanf("%d",&tcase); while(tcase--){ scanf("%s",s1); scanf("%s",s2); for(int i=0;i<4;i++){ s.v[i]=s1[i]-‘0‘; t.v[i]=s2[i]-‘0‘; } int res = bfs(s); printf("%d\n",res); } return 0; }
标签:
原文地址:http://www.cnblogs.com/liyinggang/p/5572829.html