广度优先搜索 最短路径 队列

//============================================================================
// Name        : Bfs.cpp
// Author      : judyge
// Version     :
// Copyright   : Your copyright notice
// Description : Hello World in C++, Ansi-style
//============================================================================

#include<iostream>
using namespace std;
int map[5][5];
int vis[5][5];
struct node{
    int x;
    int y;
    int pre;
}edge[100];  //节点队列
int front=0,rear=1;//队头,队尾
int dir[4][2]={{0,-1},{1,0},{0,1},{-1,0}};   //四种方向
void f(int i)//根据pre  倒向追踪法路径
{
    if(edge[i].pre!=-1)
    {
        f(edge[i].pre);
        cout<<"("<<edge[i].x<<", "<<edge[i].y<<")"<<endl;
    }
}
void BFS(int x,int y)
{
    edge[front].x=x;   //开始时节点
    edge[front].y=y;
    edge[front].pre=-1;
    while(front<rear)//队列为空时终止
    {
        int u;
        for(u=0;u<4;u++)    //下一节点---四个方向
        {
        	//从队头取一个  找他的下一节点
            int x=edge[front].x+dir[u][0];
            int y=edge[front].y+dir[u][1];
            //下一节点  如果被遍历---或是墙----或是障碍物
            if(x<0||x>=5||y<0||y>=5||vis[x][y]==1||map[x][y]==1)
                continue;   //找下一个方向
            else  //下一节点  如果没遍历---不是墙----不是障碍物
            {
                vis[x][y]=1;   //下节点设置为遍历过
                map[x][y]=1;
                edge[rear].x=x;//下一节点--入队
                edge[rear].y=y;
                edge[rear].pre=front; //记录他的前一节点
                rear++;
            }
            if(x==4&&y==4)//如果下一个节点为 4,4
                f(front);    // 找到他以前的路径打印 算一个解法
        }
        front++;//对头出队
    }
}
int main()
{
    int i,j;
    for(i=0;i<5;i++)
    {
        for(j=0;j<5;j++)
        {
            cin>>map[i][j];   //输入图
        }
    }
    memset(vis,0,sizeof(vis));
    cout<<"("<<"0, 0)"<<endl;
    BFS(0,0);
    cout<<"(4, 4)"<<endl;
    return 0;
}



//============================================================================
// Name        : bfs2.cpp
// Author      : judyge
// Version     :
// Copyright   : Your copyright notice
// Description : Hello World in C++, Ansi-style
//============================================================================

#include<stdio.h>
//四个方向
const int di[4] = {0,1,0,-1},
          dj[4] = {1,0,-1,0};
//地图
unsigned maze[5][5] = {
    2, 1, 0, 0, 0,
    0, 1, 0, 1, 0,
    0, 0, 0, 0, 0,
    0, 1, 1, 1, 0,
    0, 0, 0, 1, 0},
    head = 0, tail = 1;
//节点队列
struct { int i, j; } que[23] = {0};

void print_maze(void)
{
    int i, j;
    for (i = 0; i < 5; i++) {
        for (j = 0; j < 5; j++)
            printf("%d ", maze[i][j]);
        putchar('\n');
    }
    printf("*********\n");
}//输出路径

int main(void)
{
    while (head != tail) {
        head = (head + 1) % 23;   //头节点出队
        int i;
        for (i = 0; i < 4; i++)
        	//如果下一节点不是墙 不是障碍物 没有被遍历
            if (que[head].i + di[i] >= 0 && que[head].i + di[i] < 5
                && que[head].j + dj[i] >= 0 && que[head].j +dj[i] < 5
                && maze[que[head].i + di[i]][que[head].j +dj[i]] == 0)
            {
            	// 下一节点入队
                    que[tail = (tail + 1) % 23].i = que[head].i + di[i];
                    que[tail].j = que[head].j +dj[i];

                    maze[que[head].i + di[i]][que[head].j +dj[i]] = 2;
                   //标记已经遍历过

                    if (que[head].i + di[i] == 4 && que[head].j +dj[i] == 4) {
                        printf("Have path.\n");//如果找到出口
              }
            }
        print_maze();   //打印地图状况
    }
    printf("No path.\n");
    return 0;
}



  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值