1200字范文,内容丰富有趣,写作的好帮手!
1200字范文 > 深度优先搜索(DFS)和广度优先搜索(BFS)探究

深度优先搜索(DFS)和广度优先搜索(BFS)探究

时间:2020-02-03 05:52:37

相关推荐

深度优先搜索(DFS)和广度优先搜索(BFS)探究

附BFS解题代码:

#include<iostream>#include<queue>using namespace std;char room[23][23];int dir[4][2] ={{-1,0}, //向左。左上角坐标是(0, 0){0,-1}, //向上{1,0}, //向右{0,1} //向下};int Wx, Hy, num,num_times=0; //Wx行,Hy列。用num统计可走的位置有多少,num_times记录搜索次数#define CHECK(x, y) (x<Wx && x>=0 && y >=0 && y<Hy) //是否在room里struct node{int x,y;};//坐标点void BFS(int dx,int dy){num=1;//起点也包含在砖块内queue <node> q;//队列中放坐标点(结构体)node start, next; //缺省初始化一个起点和下一个点(结构体)start.x = dx; //给起点坐标赋值start.y = dy;q.push(start); //把赋值后的起点压入队列中while(!q.empty()) //如果队列不为空{start = q.front();//每一次都把队列头部作为起点,起点一直都在变化q.pop();//每一次都要把起点从头移除//cout<<"out"<<start.x<<start.y<<endl; //打印出队列情况,进行验证for(int i=0; i<4; i++) //按左、上、右、下,4个方向顺时针逐一搜索{next.x = start.x + dir[i][0];next.y = start.y + dir[i][1];if(CHECK(next.x,next.y) && room[next.x][next.y]=='.'){room[next.x][next.y]='#';//进队之后,标记为已经处理过,即已经走过的瓷砖下一次不能再走num++;q.push(next);//从尾插入for (int n = 0; n < Hy; n++)//有Hy列{for (int m = 0; m < Wx; m++)//一次读入一行{cout<<room[m][n];//把每次搜索完毕的瓷砖状态打印出来}cout<<endl;}num_times++;cout<<"第"<<num_times<<"次搜索完毕"<<endl;}}}}int main(){int x, y, dx, dy;while (cin >> Wx >> Hy){if (Wx==0 && Hy==0)break;for (y = 0; y < Hy; y++)//有Hy列{for (x = 0; x < Wx; x++)//一次读入一行{cin >> room[x][y];if(room[x][y] == '@')//读入起点{dx = x;dy = y;}}}cout<<endl;num = 0;BFS(dx, dy);cout << num << endl;}return 0;}

输入:

运行结果:

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。