题目要求:
输入:n和m,然后给定n×m的矩阵。之后输入x1,y1,x2,y2,分别是起点和终点。要求自己手写实现队列。
输出:输出1个数,所需要的步数。如果走不到输出“no path!”
样例:
8 8
0 0 0 0 0 0 0 1
0 1 1 1 1 0 0 0
0 1 0 1 1 1 1 0
0 1 1 0 0 0 0 0
0 0 0 1 0 1 1 1
0 1 0 0 0 0 0 0
0 1 1 1 1 1 1 0
0 0 0 0 0 0 0 0
0 0 0 7
代码:
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
int x,y,x_,y_,a[50][50],m,n,t[50][50]={0};
int flag=0;
typedef struct mynode//结点
{
int x;
int y;
struct mynode *next;
}myn;
myn *head;
typedef struct myqueue//指针
{
struct mynode *front;//头
struct mynode *rear;//尾
}myq;
myq *p;
int myempty(myq *p)//是否为空
{
return (*p).front==(*p).rear;
}
void mypush(myq *p,int x,int y)//入队列
{
myn *q;
q=(myn *)malloc(sizeof(myn));
(*q).next=NULL;
(*(*p).rear).x=x;
(*(*p).rear).y=y;
(*(*p).rear).next=q;
(*p).rear=q;
}
void mypop(myq *p)//出队列
{
myn *q;
q=(*p).front;
(*p).front=(*q).next;
free(q);
//(*p).num--;
}
int bfs(int b,int c)
{
int i,d[][2]={{1,0},{-1,0},{0,1},{0,-1}};
if(b==x_&&c==y_)
return 1;
if(myempty(p))
return 0;
if(a[b+1][c]==0||a[b-1][c]==0||a[b][c+1]==0||a[b][c-1]==0&&(b>=1&&b<=m&&c>=1&&c<=n))
{
for(i=0;i<4;i++)
if(a[b+d[i][0]][c+d[i][1]]==0)
{
a[b+d[i][0]][c+d[i][1]]=2;
mypush(p,b+d[i][0],c+d[i][1]);
t[b+d[i][0]][c+d[i][1]]=t[b][c]+1;
}
}
mypop(p);
b=(*(*p).front).x;
c=(*(*p).front).y;
return bfs(b,c);
}
int main()
{
int i,j;
p=(myq *)malloc(sizeof(myq));
head=(myn *)malloc(sizeof(myn));
(*head).next=NULL;
(*p).front=(*p).rear=head;
scanf("%d %d",&m,&n);
for(i=0;i<=49;i++)
for(j=0;j<=49;j++)
a[i][j]=1;
for(i=1;i<=m;i++)
for(j=1;j<=n;j++)
scanf("%d",&a[i][j]);
scanf("%d%d%d%d",&x,&y,&x_,&y_);
x++,y++,x_++,y_++;
a[x][y]=2;
t[x][y]=0;
mypush(p,x,y);
if(!bfs(x,y))
printf("no path!");
else printf("%d",t[x_][y_]);
return 0;
}