http://acm.hdu.edu.cn/showproblem.php?pid=1195
#include<iostream> #include<queue> using namespace std; struct Node { char data[5]; int step; }; char st[5],et[5]; int hash[10000];
int getNum(char str[]) { return (str[0]-'0')*1000 +(str[1]-'0')*100 + (str[2]-'0')*10 + (str[3]-'0'); }
void bfs() { int i,k; char tempStr[5],temp; Node p,q; queue<Node>Q; strcpy(p.data,st); p.step=0; Q.push(p); while(!Q.empty()) { q=Q.front(); Q.pop(); if(strcmp(q.data,et) == 0) { cout<<q.step<<endl; return ; } for(i=0;i<4;i++) { if(i<3)//最后一个时就不用交换了 { strcpy(tempStr,q.data); temp = tempStr[i]; tempStr[i]=tempStr[i+1]; tempStr[i+1]=temp; k=getNum(tempStr); if(hash[k]==0) { hash[k]=1; strcpy(p.data,tempStr); p.step = q.step + 1; Q.push(p); } }
if(q.data[i]=='1') { strcpy(tempStr,q.data); tempStr[i]='9'; k=getNum(tempStr); if(hash[k]==0) { hash[k]=1; strcpy(p.data,tempStr); p.step = q.step + 1; Q.push(p); }
strcpy(tempStr,q.data); tempStr[i]='2'; k=getNum(tempStr); if(hash[k]==0) { hash[k]=1; strcpy(p.data,tempStr); p.step = q.step + 1; Q.push(p); } }//if(q.data[i]=='1') else if(q.data[i]=='9') { strcpy(tempStr,q.data); tempStr[i]='8'; k=getNum(tempStr); if(hash[k]==0) { hash[k]=1; strcpy(p.data,tempStr); p.step = q.step + 1; Q.push(p); }
strcpy(tempStr,q.data); tempStr[i]='1'; k=getNum(tempStr); if(hash[k]==0) { hash[k]=1; strcpy(p.data,tempStr); p.step = q.step + 1; Q.push(p); } }//if(q.data[i]=='9') else { strcpy(tempStr,q.data); tempStr[i] = tempStr[i] + 1; k=getNum(tempStr); if(hash[k]==0) { hash[k]=1; strcpy(p.data,tempStr); p.step = q.step + 1; Q.push(p); }
strcpy(tempStr,q.data); tempStr[i] = tempStr[i] - 1; k=getNum(tempStr); if(hash[k]==0) { hash[k]=1; strcpy(p.data,tempStr); p.step = q.step + 1; Q.push(p); } }//else }//for(i=0;i<4;i++) }//while(!Q.empty()) }
int main() { int t; cin>>t; while(t--) { cin>>st>>et; memset(hash,0,sizeof(hash)); bfs(); } return 0; }
|