唉,花费了一上午才给搞出来;
代码有点长,但很好理解;
出错的原因;
一;每次操作之前都要更新:cur=next;(重要)
二;标记visit用四维,用两维吼不住;
三;输入格式是用字符输入,在转化为数字,直接输入数字会把它当做一个数。
#include"stdio.h"
#include"string.h"
#include"queue"
using namespace std;
int a,b,c,d,e,f,g,h;
int visit[10][10][10][10];
struct point
{
int x,y,z,w;
int step;
};
int bfs(int x,int y,int z,int w)
{
memset(visit,0,sizeof(visit));
queue<point>q;
point cur,next;
cur.x=x,cur.y=y,cur.z=z;
cur.w=w,cur.step=0;
visit[x][y][z][w]=1;
q.push(cur);
while(!q.empty())
{
next=q.front();
q.pop();
if(next.x==e&&next.y==f&&next.z==g&&next.w==h)
return next.step;
cur=next;
cur.x=next.x-1;
{
if(cur.x==0)
cur.x=9;
if(visit[cur.x][cur.y][cur.z][cur.w]==0)
{
cur.step=next.step+1;
visit[cur.x][cur.y][cur.z][cur.w]=1;
q.push(cur);
}
}
cur=next;
cur.x=next.x+1;
{
if(cur.x==10)
cur.x=1;
if(visit[cur.x][cur.y][cur.z][cur.w]==0)
{
cur.step=next.step+1;
visit[cur.x][cur.y][cur.z][cur.w]=1;
q.push(cur);
}
}
cur=next;
cur.y=next.y-1;
{
if(cur.y==0)
cur.y=9;
if(visit[cur.x][cur.y][cur.z][cur.w]==0)
{
cur.step=next.step+1;
visit[cur.x][cur.y][cur.z][cur.w]=1;
q.push(cur);
}
}
cur=next;
cur.y=next.y+1;
{
if(cur.y==10)
cur.y=1;
if(visit[cur.x][cur.y][cur.z][cur.w]==0)
{
cur.step=next.step+1;
visit[cur.x][cur.y][cur.z][cur.w]=1;
q.push(cur);
}
}
cur=next;
cur.z=next.z-1;
{
if(cur.z==0)
cur.z=9;
if(visit[cur.x][cur.y][cur.z][cur.w]==0)
{
cur.step=next.step+1;
visit[cur.x][cur.y][cur.z][cur.w]=1;
q.push(cur);
}
}
cur=next;
cur.z=next.z+1;
{
if(cur.z==10)
cur.z=1;
if(visit[cur.x][cur.y][cur.z][cur.w]==0)
{
cur.step=next.step+1;
visit[cur.x][cur.y][cur.z][cur.w]=1;
q.push(cur);
}
}
cur=next;
cur.w=next.w-1;
{
if(cur.w==0)
cur.w=9;
if(visit[cur.x][cur.y][cur.z][cur.w]==0)
{
cur.step=next.step+1;
visit[cur.x][cur.y][cur.z][cur.w]=1;
q.push(cur);
}
}
cur=next;
cur.w=next.w+1;
{
if(cur.w==10)
cur.w=1;
if(visit[cur.x][cur.y][cur.z][cur.w]==0)
{
cur.step=next.step+1;
visit[cur.x][cur.y][cur.z][cur.w]=1;
q.push(cur);
}
}
cur=next;
cur.x=next.y;
cur.y=next.x;
if(visit[cur.x][cur.y][cur.z][cur.w]==0)
{
cur.step=next.step+1;
visit[cur.x][cur.y][cur.z][cur.w]=1;
q.push(cur);
}
cur=next;
cur.y=next.z;
cur.z=next.y;
if(visit[cur.x][cur.y][cur.z][cur.w]==0)
{ cur.step=next.step+1;
visit[cur.x][cur.y][cur.z][cur.w]=1;
q.push(cur);
}
cur=next;
cur.z=next.w;
cur.w=next.z;
if(visit[cur.x][cur.y][cur.z][cur.w]==0)
{
cur.step=next.step+1;
visit[cur.x][cur.y][cur.z][cur.w]=1;
q.push(cur);
}
}
return -1;
}
int main()
{
int k;
scanf("%d",&k);
char aa[100],bb[100];
while(k--)
{
scanf("%s%s",aa,bb);
a=aa[0]-'0';b=aa[1]-'0';c=aa[2]-'0';d=aa[3]-'0';
e=bb[0]-'0';f=bb[1]-'0';g=bb[2]-'0';h=bb[3]-'0';
printf("%d\n",bfs(a,b,c,d));
}
return 0;
}
下面用数组写的,更简短点。。(相邻交换时i《3)
#include"stdio.h"
#include"string.h"
#include"queue"
using namespace std;
int a[60],b[60];
int visit[20][20][20][20];
struct point
{
int n[4],step;
};
int bfs()
{
int i,flag;
memset(visit,0,sizeof(visit));
queue<point>q;
point cur,next;
for(i=0;i<4;i++)
{
cur.n[i]=a[i];
}
cur.step=0;
visit[cur.n[0]][cur.n[1]][cur.n[2]][cur.n[3]]=1;
q.push(cur);
while(!q.empty())
{
next=q.front();
q.pop();
flag=1;
for(i=0;i<4;i++)
{
if(next.n[i]!=b[i])
flag=0;
}
if(flag)
return next.step;
for(i=0;i<4;i++)//每一位试探加1操作
{cur=next;
cur.n[i]=next.n[i]+1;
if(cur.n[i]==10)
cur.n[i]=1;
if(visit[cur.n[0]][cur.n[1]][cur.n[2]][cur.n[3]]==0)
{
visit[cur.n[0]][cur.n[1]][cur.n[2]][cur.n[3]]=1;
cur.step=next.step+1;
q.push(cur);
}
}
for(i=0;i<4;i++) //每一位试探减1操作
{ cur=next;
cur.n[i]=next.n[i]-1;
if(cur.n[i]==0)
cur.n[i]=9;
if(visit[cur.n[0]][cur.n[1]][cur.n[2]][cur.n[3]]==0)
{
visit[cur.n[0]][cur.n[1]][cur.n[2]][cur.n[3]]=1;
cur.step=next.step+1;
q.push(cur);
}
}
for(i=0;i<3;i++)//相邻交换
{ cur=next;
cur.n[i]=next.n[i+1];
cur.n[i+1]=next.n[i];
if(visit[cur.n[0]][cur.n[1]][cur.n[2]][cur.n[3]]==0)
{
visit[cur.n[0]][cur.n[1]][cur.n[2]][cur.n[3]]=1;
cur.step=next.step+1;
q.push(cur);
}
}
}
return 0;
}
int main()
{
int i,k;
char ee[100],ff[100];
scanf("%d",&k);
while(k--)
{
scanf("%s%s",ee,ff);
for(i=0;i<4;i++)
{
a[i]=ee[i]-'0';
b[i]=ff[i]-'0';
}
printf("%d\n",bfs());
}
return 0;
}