两份代码都是我写的,前后隔了很久...还好没有忘记bfs的基本思路
关于bfs和dfs我上传了我们老师上课的ppt,从图片看来很形象,容易懂...推荐....
下面是一个图示,就是我上传资料中间的一部分.....更多的还有栈,队列,什么的...bfs dfs,有兴趣的可以去我的资源出下载
图一表示起点,首先起点入队,队列中有(x1,y1),while(!q.empty())这个循环中出队,图二查看出队的这个点(此时是起点)四个方向,如果没走过就入队那么,现在队列中就有(x2,y2)(x3,y3)然后就一次进行上面的操作
然后
最后就搜索到啦......下面是代码....第一次这么认真的发文章...希望能帮到一些人
也供一些人指点.....
/*#include<cstdio> #include<queue> #include<cstring> using namespace std; int map[9][9]={ {1,1,1,1,1,1,1,1,1}, {1,0,0,1,0,0,1,0,1}, {1,0,0,1,1,0,0,0,1}, {1,0,1,0,1,1,0,1,1}, {1,0,0,0,0,1,0,0,1}, {1,1,0,1,0,1,0,0,1}, {1,1,0,1,0,1,0,0,1}, {1,1,0,1,0,0,0,0,1}, {1,1,1,1,1,1,1,1,1} }; int tem_map[9][9];//临时地图,每次对其操作,每次开始重新copy int step[9][9];//记录走到点的步数 int x_sta,x_end,y_sta,y_end; int arr[4][2]={{-1,0},{0,1},{1,0},{0,-1}}; queue<int>q; void bfs() { int x,y; q.push(x_sta); q.push(y_sta);//起点入队 step[x_sta][y_sta]=1;//当前点的位置标记为第一步,和上面图示有点不同,但思路是一样的 while(!q.empty()) { x=q.front();q.pop();//出队一组坐标,并及时删除 y=q.front();q.pop(); if(x==x_end && y==y_end)//判断是否这个出队的点是出口点 { printf("%d\n",step[x][y]-1); return; } for(int i=0;i<4;i++)//查看四个方向,如果对于这个不熟悉的可以看我下面那次的代码,四个if,四个方向,和这个一样 { if(x+arr[i][0]>0 && x+arr[i][0]<9 && y+arr[i][1]>0 && y+arr[i][1]<9 && !tem_map[x+arr[i][0]][y+arr[i][1]]) { tem_map[x+arr[i][0]][y+arr[i][1]]=1;//标记走过此点 step[x+arr[i][0]][y+arr[i][1]]=step[x][y]+1;//步数在此次出队的(x,y)步数上加一 q.push(x+arr[i][0]);//入队 q.push(y+arr[i][1]); } } } } int main() { int N; scanf("%d",&N); while(N--) { while(!q.empty())//初始化清空 q.pop(); memcpy(tem_map,map,sizeof(map));// scanf("%d%d%d%d",&x_sta,&y_sta,&x_end,&y_end); bfs(); } return 0; }*/ #include<iostream> #include<queue> #include<cstring> #include<cstdio> using namespace std; struct node { int x,y; }; int s[9][9]={ {1,1,1,1,1,1,1,1,1}, {1,0,0,1,0,0,1,0,1}, {1,0,0,1,1,0,0,0,1}, {1,0,1,0,1,1,0,1,1}, {1,0,0,0,0,1,0,0,1}, {1,1,0,1,0,1,0,0,1}, {1,1,0,1,0,1,0,0,1}, {1,1,0,1,0,0,0,0,1}, {1,1,1,1,1,1,1,1,1} }; int x[9][9]; int main() { int n; int s_x,s_y,e_x,e_y; node a,b; cin>>n; while(n--) { memcpy(x,s,sizeof(s)); cin>>s_x>>s_y>>e_x>>e_y; a.x=s_x; a.y=s_y; x[s_x][s_y]=1;//记录长度 queue<node> A; A.push(a); while(!A.empty()) { a.x=A.front().x; a.y=A.front().y; A.pop(); if(a.x==e_x&&a.y==e_y) break; if(!x[a.x+1][a.y]) { b.x=a.x+1; b.y=a.y; x[b.x][b.y]=x[a.x][a.y]+1; A.push(b); } if(!x[a.x][a.y+1]) { b.x=a.x; b.y=a.y+1; x[b.x][b.y]=x[a.x][a.y]+1; A.push(b); } if(!x[a.x-1][a.y]) { b.x=a.x-1; b.y=a.y; x[b.x][b.y]=x[a.x][a.y]+1; A.push(b); } if(!x[a.x][a.y-1]) { b.x=a.x; b.y=a.y-1; x[b.x][b.y]=x[a.x][a.y]+1; A.push(b); } } cout<<x[a.x][a.y]-1<<endl; } return 0; } /* 2 3 1 5 7 3 1 6 7 样例输出 12 11 */