题目:
代码:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
//只有一个路线,没有深度优先的分支!!!
//节点法创建顺序队列
//节点
typedef struct note
{
int x;
int y;
int s;
}note;
int main()
{
int i,j,k,n,p,q,tx,ty,flag,book[51][51]={0},a[51][51]={0};
scanf("%d",&n);
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
{
a[i][j]=n;
}
//方向数组
int next[4][2]=
{
{0,1},
{1,0},
{0,-1},
{-1,0}
};
//队列
note que[2501];
int head;
int tail;
//队列初始化
head=1;tail=1;
//出发点进入队列,并且标记
que[1].x=1;
que[1].y=1;
que[1].s=0;
tail++;
book[1][1]=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<1||ty<1||tx>n||ty>n)
continue;
//去除障碍物和已走过路径情况
if(a[tx][ty]!=0||book[tx][ty]!=0)
continue;
//可以走
//标记,入队
book[tx][ty]=1;
que[tail].x=tx;
que[tail].y=ty;
que[tail].s=que[head].s+1;//父亲步数+1
tail++;
//如果到达终点,任务结束!跳1
if(tx==p&&ty==q)
{
flag=1;
break;
}
}
//跳2,去打印
if(flag==1)
{
break;
}
//四种节点扩展完毕,消除父节点
head++;
}
//打印步数
printf("%d",que[tail-1].s);
system("pause");
return 0;
}