广度优先搜索 最短路径 队列
2015-05-07 17:55
531 查看
//============================================================================ // 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;
}
相关文章推荐
- 广度优先搜索--迷宫最短路径--队列
- 迷宫问题(广度优先搜索,输出最短路径)
- 迷宫最短路径的C++实现(队列:广度优先)
- 广度优先搜索之最短路径
- 迷宫最短路径的C++实现(队列:广度优先)
- (广度优先搜索第一课)迷宫的最短路径 - BFS
- 从拓扑排序到广度优先搜索到单源最短路径
- 最短路径条数问题 - 广度优先搜索
- 图论(三)------广度优先搜索与单源无权最短路径
- (原创)广度优先搜索解决最短路径问题
- 图论(三)------广度优先搜索与单源无权最短路径
- 广度优先搜索迷宫的最短路径走法!
- c语言描述之广度优先搜索——无权最短路径
- 迷宫:广度优先搜索求最短路径
- Catch The Caw——(广度优先搜索的应用,队列)
- 广度优先搜索迷宫路径算法的实现
- C语言广度优先搜索之迷宫(队列)
- hdu 1026 Ignatius and the Princess (广度优先搜索+路径打印)
- HDU 2544 用优先队列写的最短路径
- 数据结构之图(深度优先搜索和广度优先搜索使用的队列和栈)