题目解析:隐式图的搜索,总共11种状态,依次进行搜即可,注意中间数字输入时要按字符串进行输入。
代码如下:
#include<stdio.h> #include<string.h> #include<queue> using namespace std; int begin[6],end[6]; int visit[13][13][13][13]; struct node { int a,b,c,d,step; }; void bfs(int x1,int x2,int x3,int x4) { memset(visit,0,sizeof(visit)); node node1,node2; queue<node>q; node1.a=x1; node1.b=x2; node1.c=x3; node1.d=x4; node1.step=0; q.push(node1); visit[node1.a][node1.b][node1.c][node1.d]=1; while(!q.empty()) { node2=q.front(); q.pop(); if(node2.a==end[0]&&node2.b==end[1]&&node2.c==end[2]&&node2.d==end[3]) { printf("%d\n",node2.step); return; } else //总共11种状态 { node1.a=node2.a+1; //第一位数字加1 if(node1.a==10) node1.a=1; node1.b=node2.b; node1.c=node2.c; node1.d=node2.d; node1.step=node2.step+1; if(!visit[node1.a][node1.b][node1.c][node1.d]) { q.push(node1); visit[node1.a][node1.b][node1.c][node1.d]=1; } node1.a=node2.a; //第二位数字加1 node1.b=node2.b+1; if(node1.b==10) node1.b=1; node1.c=node2.c; node1.d=node2.d; node1.step=node2.step+1; if(!visit[node1.a][node1.b][node1.c][node1.d]) { q.push(node1); visit[node1.a][node1.b][node1.c][node1.d]=1; } node1.a=node2.a; //第三位数字加1 node1.b=node2.b; node1.c=node2.c+1; if(node1.c==10) node1.c=1; node1.d=node2.d; node1.step=node2.step+1; if(!visit[node1.a][node1.b][node1.c][node1.d]) { q.push(node1); visit[node1.a][node1.b][node1.c][node1.d]=1; } node1.a=node2.a; //第四位加1 node1.b=node2.b; node1.c=node2.c; node1.d=node2.d+1; if(node1.d==10) node1.d=1; node1.step=node2.step+1; if(!visit[node1.a][node1.b][node1.c][node1.d]) { q.push(node1); visit[node1.a][node1.b][node1.c][node1.d]=1; } node1.a=node2.a-1; //第一位减1 if(node1.a==0) node1.a=9; node1.b=node2.b; node1.c=node2.c; node1.d=node2.d; node1.step=node2.step+1; if(!visit[node1.a][node1.b][node1.c][node1.d]) { q.push(node1); visit[node1.a][node1.b][node1.c][node1.d]=1; } node1.a=node2.a; //第二位减1 node1.b=node2.b-1; if(node1.b==0) node1.b=9; node1.c=node2.c; node1.d=node2.d; node1.step=node2.step+1; if(!visit[node1.a][node1.b][node1.c][node1.d]) { q.push(node1); visit[node1.a][node1.b][node1.c][node1.d]=1; } node1.a=node2.a; //第三位减1 node1.b=node2.b; node1.c=node2.c-1; if(node1.c==0) node1.c=9; node1.d=node2.d; node1.step=node2.step+1; if(!visit[node1.a][node1.b][node1.c][node1.d]) { q.push(node1); visit[node1.a][node1.b][node1.c][node1.d]=1; } node1.a=node2.a; node1.b=node2.b; node1.c=node2.c; node1.d=node2.d-1; //第四位减1 if(node1.d==0) node1.d=9; node1.step=node2.step+1; if(!visit[node1.a][node1.b][node1.c][node1.d]) { q.push(node1); visit[node1.a][node1.b][node1.c][node1.d]=1; } node1.a=node2.b; //交换1,2位 node1.b=node2.a; node1.c=node2.c; node1.d=node2.d; node1.step=node2.step+1; if(!visit[node1.a][node1.b][node1.c][node1.d]) { q.push(node1); visit[node1.a][node1.b][node1.c][node1.d]=1; } node1.a=node2.a; //交换2,3位 node1.b=node2.c; node1.c=node2.b; node1.d=node2.d; node1.step=node2.step+1; if(!visit[node1.a][node1.b][node1.c][node1.d]) { q.push(node1); visit[node1.a][node1.b][node1.c][node1.d]=1; } node1.a=node2.a; //交换3,4位 node1.b=node2.b; node1.c=node2.d; node1.d=node2.c; node1.step=node2.step+1; if(!visit[node1.a][node1.b][node1.c][node1.d]) { q.push(node1); visit[node1.a][node1.b][node1.c][node1.d]=1; } } } } int main() { int icase; scanf("%d",&icase); while(icase--) { char str1[6],str2[6]; scanf("%s%s",str1,str2); for(int i=0;i<strlen(str1);i++) { begin[i]=str1[i]-'0'; end[i]=str2[i]-'0'; } bfs(begin[0],begin[1],begin[2],begin[3]); } return 0; }