迷宫的最短路径(局限版)
2017-03-31 23:26
211 查看
//书上的例题,算法竞赛入门经典!!敲了一晚上终于AC了!!!还是水题。。#include<cstdio>#include<iostream>#include<algorithm>#include<cmath>#include<map>#include<queue>#include<stdlib.h>#include<string>#include<cstring>
using namespace std;const int MAX_N=10;const int MAX_M=10;
const int INF = 100000000;
typedef pair<int ,int> P;
char maze[MAX_N][MAX_M+1] ={ { '#', 'S', '#' , '#','#', '#', '#', '#', '.', '#'}, { '.', '.', '.' , '.','.', '.', '#', '.', '.', '#'}, { '.', '#', '.' , '#','#', '.', '#', '#', '.', '#'}, { '.', '#', '.' , '.','.', '.', '.', '.', '.', '.'}, { '#', '#', '.' , '#','#', '.', '#', '#', '#', '#'}, { '.', '.', '.' , '.','#', '.', '.', '.', '.', '#'}, { '.', '#', '#' , '#','#', '#', '#', '#', '.', '#'}, { '.', '.', '.' , '.','#', '.', '.', '.', '.', '.'}, { '.', '#', '#' , '#','#', '.', '#', '#', '#', '.'}, { '.', '.', '.' , '.','#', '.', '.', '.', 'G', '#'},};
int N = 10, M = 10;int sx = 0;int sy = 1;int gx = 9;int gy = 8;int d[MAX_N][MAX_M];int dx[4] = {1, 0, -1, 0}, dy[] = { 0, 1, 0, -1};
int bfs(){ queue<P> que; // 初始化所有距离为INF for( int i = 0; i < N;i++) { for( int j = 0; j <M; j++) { d[i][j] = INF; } }
// 将起点加入队列,并将这一点的距离设置为0 que.push(P(sx, sy)); d[sx][sy] = 0; while( que.size()) { P p = que.front();que.pop(); if(p.first == gx&& p.second == gy) break;
// 向四个方向循环 for( int i = 0; i <4; i++ ) { // 移动之后的坐标 int nx = p.first +dx[i]; int ny = p.second+ dy[i];
// 判断是否可以移动以及是否已经访问过(d[nx][ny] != INF即已经访问过) if(0<= nx&& nx < N && 0 <= ny && ny < M &&maze[nx][ny] != '#' && d[nx][ny] == INF) { // 可以移动的话,将它加入队列,并且到达该位置的距离确定为到p的距离+1 que.push(P(nx,ny)); d[nx][ny] = d[p.first][p.second]+ 1; } } }
return d[gx][gy];}
int main(){
int res = bfs();
printf("%d/n",res); return 0;}
using namespace std;const int MAX_N=10;const int MAX_M=10;
const int INF = 100000000;
typedef pair<int ,int> P;
char maze[MAX_N][MAX_M+1] ={ { '#', 'S', '#' , '#','#', '#', '#', '#', '.', '#'}, { '.', '.', '.' , '.','.', '.', '#', '.', '.', '#'}, { '.', '#', '.' , '#','#', '.', '#', '#', '.', '#'}, { '.', '#', '.' , '.','.', '.', '.', '.', '.', '.'}, { '#', '#', '.' , '#','#', '.', '#', '#', '#', '#'}, { '.', '.', '.' , '.','#', '.', '.', '.', '.', '#'}, { '.', '#', '#' , '#','#', '#', '#', '#', '.', '#'}, { '.', '.', '.' , '.','#', '.', '.', '.', '.', '.'}, { '.', '#', '#' , '#','#', '.', '#', '#', '#', '.'}, { '.', '.', '.' , '.','#', '.', '.', '.', 'G', '#'},};
int N = 10, M = 10;int sx = 0;int sy = 1;int gx = 9;int gy = 8;int d[MAX_N][MAX_M];int dx[4] = {1, 0, -1, 0}, dy[] = { 0, 1, 0, -1};
int bfs(){ queue<P> que; // 初始化所有距离为INF for( int i = 0; i < N;i++) { for( int j = 0; j <M; j++) { d[i][j] = INF; } }
// 将起点加入队列,并将这一点的距离设置为0 que.push(P(sx, sy)); d[sx][sy] = 0; while( que.size()) { P p = que.front();que.pop(); if(p.first == gx&& p.second == gy) break;
// 向四个方向循环 for( int i = 0; i <4; i++ ) { // 移动之后的坐标 int nx = p.first +dx[i]; int ny = p.second+ dy[i];
// 判断是否可以移动以及是否已经访问过(d[nx][ny] != INF即已经访问过) if(0<= nx&& nx < N && 0 <= ny && ny < M &&maze[nx][ny] != '#' && d[nx][ny] == INF) { // 可以移动的话,将它加入队列,并且到达该位置的距离确定为到p的距离+1 que.push(P(nx,ny)); d[nx][ny] = d[p.first][p.second]+ 1; } } }
return d[gx][gy];}
int main(){
int res = bfs();
printf("%d/n",res); return 0;}
相关文章推荐
- 迷宫问题之最短路径bfs
- bfs 迷宫输出最短路径
- 深搜和广搜 迷宫最短路径
- Unity3D之迷宫寻路_A*最短路径寻路
- bfs_迷宫求最短路径
- poj3984迷宫问题 广搜+最短路径+模拟队列
- 迷宫的最短路径 (BFS)
- 关于栈与递归求解迷宫与迷宫最短路径问题
- 实现迷宫问题的所有路径及最短路径程序
- [ACM实验四]ACM程序设计基础(2)(全排列与迷宫最短路径)
- 迷宫-最短路径距离-BFS
- 迷宫的最短路径(深度bfs)
- 算12/24点算法 布线问题/迷宫最短路径
- 广度优先搜索(BFS)——迷宫的最短路径
- 3.10 用栈实现解决迷宫问题(输出一条路径(非最短路径))
- bfs走迷宫记录最短路径(求大神指…
- BFS 迷宫的最短路径问题
- poj3984迷宫问题 广搜+最短路径+模拟队列
- 宽度优先搜索——迷宫的最短路径
- 5X5迷宫,求起点和终点的最短路径以及最短路径个数(百分数)