较容易理解 的广搜

来源:互联网 发布:杀破狼js百度云 编辑:程序博客网 时间:2024/05/17 07:49
#include<iostream>#include<stdio.h>#include<queue>#include<string>using namespace std;#define MAX 10int map[MAX][MAX];int i,j;int n;int visited[MAX][MAX];int dist[MAX][MAX];int direction[4][2]={{0,1},{1,0},{0,-1},{-1,0}};class Point{public:int col;int row;};int over(Point p){if(p.col<0||p.row<0)return 1;if(p.row>=n||p.col>=n)return 1;elsereturn 0;}Point newpoint;void bfs(Point p){visited[p.row][p.col]=1;queue<Point> q;q.push(p);dist[p.row][p.col]=0;//注意初始化while(!q.empty()){Point cs;cs=q.front();q.pop();//出队列一个元素if(cs.col==n&&cs.row==n)//到达终点。以为从这理出队列,所以从这里判断。return ;for(i=0;i<4;i++){newpoint.col=cs.col;newpoint.row=cs.row;newpoint.row+=direction[i][0];newpoint.col+=direction[i][1];if(!visited[newpoint.row][newpoint.col]&&!over(newpoint)&&!map[newpoint.row][newpoint.col]){dist[newpoint.row][newpoint.col]=dist[cs.row][cs.col]+1;q.push(newpoint);visited[newpoint.row][newpoint.col]=1;}}}}int main(){freopen("input.txt","r",stdin);while(scanf("%d",&n)){//初始化for(i=0;i<n;i++){for(j=0;j<n;j++){map[i][j]=0;dist[i][j]=0;visited[i][j]=0;}}//输入getchar();char str[MAX];for(i=0;i<n;i++){gets(str);for(j=0;j<n;j++){map[i][j]=str[j]-'0';}}//计算Point p;p.col=0;p.row=0;bfs(p);cout<<dist[n-1][n-1]<<endl;}return 0;}/*输入数据50001101000001011000110000dist矩阵。012002305004560056781 搜索法的原则是先放入第一个初始的点。从队列里面取出来一个点,标记访问过,扩展这个点的所有点,标记访问过(因为以后访问的都只是他周围的点,所以对他自己判定不生效)。直到队列为空2 编程的时候注意代码的美感。3 这个问题有一个拼写错误visited[newpoint.row][newpoint.col];4 要简化一下。有一个start点,让后其他的改为p和cs。5 搜索题肯定有的东西     1 方向 2 判出界 3 定义类Point*/


原创粉丝点击