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

来源:互联网 发布:复读软件 编辑:程序博客网 时间:2024/04/29 10:16
//============================================================================// 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 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 婆婆老师说孩子怎么办 初生婴儿不吃药怎么办 讨厌婆婆带孩子怎么办 孩子写字手没劲怎么办 孩子一口药不吃怎么办 小孩不爱喝药怎么办 小孩恶心想吐怎么办 孩子和婆婆不好怎么办 孩子吃东西不消化吐怎么办 小孩吃东西吐了怎么办 儿童吃饭容易吐怎么办 宝宝吃饭会吐怎么办 小孩咳嗽还呕吐怎么办 咳嗽严重到呕吐怎么办 幼儿园中班不会写字怎么办 胃难受吐了怎么办 小孩不肯学写字怎么办 孩子不爱穿内裤怎么办 孩子长期不吃肉怎么办 小孩子不吃肉怎么办呢? 一年级小孩写字慢怎么办 听障碍放弃了怎么办 宝宝开始写字该怎么办 恢复的文档乱码怎么办 小孩做作业磨蹭怎么办 宝宝用左手写字怎么办 小孩动作太慢怎么办 幼儿园不去上学怎么办 嫌弃婆婆带孩子怎么办 孩子写字特别慢怎么办 幼儿园孩子不愿写字怎么办 孩子不愿用力写字怎么办 老公得了懒癌怎么办 太懒不想上班怎么办 写字太多手臂痛怎么办 小孩读书务工证怎么办 一年级孩子撕书怎么办 孩子上幼儿园不适应怎么办 一年级没办学籍怎么办 宝宝不爱做作业怎么办 儿子不爱做作业怎么办