您的位置:首页 > 其它

nyoj 58 最小步数问题 BFS

2016-07-28 18:21 357 查看
#include<stdio.h>
struct note
{
int x;
int y;
int s;
};
int main()
{
struct note que[82];
int a[9][9]={ 1,1,1,1,1,1,1,1,1,
<span style="white-space:pre">		</span>      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};//由于题目已经给了迷宫的地图 因此直接定义即可 若没有给 需要少许改动输入即可
int T;
int next[4][2]={{0,1},{1,0},{0,-1},{-1,0}};//上下左右的前进方向
int head,tail;//采用队列实现广搜的储存;
int i,j,k,n,m,startx,starty,p,q,tx,ty,flag;
scanf("%d",&T);
while(T--)
{
int book[9][9]={0};
scanf("%d%d%d%d",&startx,&starty,&p,&q);
head=0;
tail=0;
flag=0;
que[tail].x=startx;
que[tail].y=starty;
que[tail].s=0;
tail++;
book[startx][starty]=1;
while(head<tail)
{
for(k=0;k<=3;k++)
{
tx=que[head].x+next[k][0];
ty=que[head].y+next[k][1];
if(tx<0||tx>9||ty<0||ty>9)
continue;
if(a[tx][ty]==0&&book[tx][ty]==0)
{
book[tx][ty]=1;//bfs每次只入队一次
que[tail].x=tx;
que[tail].y=ty;
que[tail].s=que[head].s+1;
tail++;
}
if(tx==p&&ty==q)
{
flag=1;
break;
}
}
if(flag==1)
break;
head++;//只有当前一个点扩展结束后 才能继续向后扩展
}
if(startx==p&&starty==q)
printf("0\n");
else
printf("%d\n",que[tail-1].s);//tail指向队列队尾的下一个位置 所以需要-1;

}
return 0;
}
如果要求给出路径 可以在结构体中多加一个专门用来记录路径的变量作为编号
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: