【实训】走迷宫(手动实现队列+bfs)

题目要求:

输入: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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值