最少步数
http://acm.nyist.net/JudgeOnline/problem.php?pid=58
思路:广度优先搜索利用队列来实现
#include"stdio.h"
#include"string.h"
int c,d,rear=0,last=0;
int q1[82]={0},q2[82]={0},v[9][9],dx[4]={-1,0,1,0},dy[4]={0,-1,0,1},flat[82]={0};
int visit[9][9]={{1,1,1,1,1,1,1,1,1},{1,0,0,1,0,0,1,0,1},{1,0,0,1,1,0,0,0,1},{1,0,1,0,1,1,0,1,1},{1,0,0,0,0,1,0,0,1},{1,1,0,1,0,1,0,0,1},{1,1,0,1,0,1,0,0,1},{1,1,0,1,0,0,0,0,1},{1,1,1,1,1,1,1,1,1}};
void bfs(int a,int b)
{
int nx,ny,k;
q1[last]=a;
q2[last++]=b;//进队
while(rear<=last)
{
a=q1[rear];
b=q2[rear++];//出队
v[a][b]=1;
if(a==c&&b==d)
{
printf("%d\n",flat[rear-1]);
return ;
}
for(k=0;k<4;k++)
{
nx=a+dx[k];
ny=b+dy[k];
if(nx>=0&&nx<9&&ny>=0&&ny<9&&!v[nx][ny]&&!visit[nx][ny])
{
flat[last]=flat[rear-1]+1;
q1[last]=nx;
q2[last++]=ny; //进队
}
}
}
}
int main()
{
int a,b,n;
scanf("%d",&n);
while(n--)
{
scanf("%d%d%d%d",&a,&b,&c,&d);
memset(v,0,sizeof(v));
memset(flat,0,sizeof(flat));
rear=0;last=0;
bfs(a,b);
}
return 0;
}