C++广度优先搜索算法之走出迷宫
2017-06-09 21:15
169 查看
走出迷宫
Description
当你站在一个迷宫里的时候,往往会被错综复杂的道路弄得失去方向感,如果你能得到迷宫地图,事情就会变得非常简单。
假设你已经得到了一个n*m的迷宫的图纸,请你找出从起点到出口的最短路。
Input第一行是两个整数n和m(1<=n,m<=100),表示迷宫的行数和列数。
接下来n行,每行一个长为m的字符串,表示整个迷宫的布局。字符'.'表示空地,'#'表示墙,'S'表示起点,'T'表示出口。Output输出从起点到出口最少需要走的步数。
Sample Input
Sample Output
这是典型的迷宫求最短路径问题,类似的题还有仙岛求药、拯救行动、献给阿尔吉侬的花束……
代码如下:
#include<cstdio>
int head=0,tail=1,nextx,nexty,n,m,beginx,beginy,endx,endy;
int pre[100000],a[100000],b[100000];
int x[4]={0,0,1,-1},y[4]={1,-1,0,0},total;
bool mark[100][100],flag;
char map[100][100];
void find(int d)
{
if(pre[d]!=0)find(pre[d]);
total++;
}
bool check(int x,int y)
{
if(x<n&&y<m&&x>=0&&y>=0)return 1;
return 0;
}
void bfs()
{
a[1]=beginx;
b[1]=beginy;
mark[beginx][beginy]=1;
pre[1]=0;
head=0;tail=1;
while(head!=tail)
{
head++;
for(int i=0;i<4;i++)
{
nextx=a[head]+x[i];
nexty=b[head]+y[i];
if(check(nextx,nexty)&&!mark[nextx][nexty]&&map[nextx][nexty]!='#')
{
tail++;
a[tail]=nextx;
b[tail]=nexty;
pre[tail]=head;
mark[nextx][nexty]=1;
if(a[tail]==endx&&b[tail]==endy)
{
find(tail);
printf("%d\n",total-1);
flag=1;
return ;
}
}
}
}
}
main()
{
scanf("%d%d",&n,&m);
for(int i=0;i<n;i++)
{
scanf("%s",map[i]);
for(int j=0;j<m;j++)
{
if(map[i][j]=='S'){beginx=i;beginy=j;}
if(map[i][j]=='T'){endx=i;endy=j;}
}
}
if(beginx==endx&&beginy==endy)
{
printf("0\n");
return 0;
}
bfs();
if(!flag) printf("-1\n");
}
走出迷宫
Description
当你站在一个迷宫里的时候,往往会被错综复杂的道路弄得失去方向感,如果你能得到迷宫地图,事情就会变得非常简单。
假设你已经得到了一个n*m的迷宫的图纸,请你找出从起点到出口的最短路。
Input第一行是两个整数n和m(1<=n,m<=100),表示迷宫的行数和列数。
接下来n行,每行一个长为m的字符串,表示整个迷宫的布局。字符'.'表示空地,'#'表示墙,'S'表示起点,'T'表示出口。Output输出从起点到出口最少需要走的步数。
Sample Input
3 3 S#T .#. ...
Sample Output
6
这是典型的迷宫求最短路径问题,类似的题还有仙岛求药、拯救行动、献给阿尔吉侬的花束……
代码如下:
#include<cstdio>
int head=0,tail=1,nextx,nexty,n,m,beginx,beginy,endx,endy;
int pre[100000],a[100000],b[100000];
int x[4]={0,0,1,-1},y[4]={1,-1,0,0},total;
bool mark[100][100],flag;
char map[100][100];
void find(int d)
{
if(pre[d]!=0)find(pre[d]);
total++;
}
bool check(int x,int y)
{
if(x<n&&y<m&&x>=0&&y>=0)return 1;
return 0;
}
void bfs()
{
a[1]=beginx;
b[1]=beginy;
mark[beginx][beginy]=1;
pre[1]=0;
head=0;tail=1;
while(head!=tail)
{
head++;
for(int i=0;i<4;i++)
{
nextx=a[head]+x[i];
nexty=b[head]+y[i];
if(check(nextx,nexty)&&!mark[nextx][nexty]&&map[nextx][nexty]!='#')
{
tail++;
a[tail]=nextx;
b[tail]=nexty;
pre[tail]=head;
mark[nextx][nexty]=1;
if(a[tail]==endx&&b[tail]==endy)
{
find(tail);
printf("%d\n",total-1);
flag=1;
return ;
}
}
}
}
}
main()
{
scanf("%d%d",&n,&m);
for(int i=0;i<n;i++)
{
scanf("%s",map[i]);
for(int j=0;j<m;j++)
{
if(map[i][j]=='S'){beginx=i;beginy=j;}
if(map[i][j]=='T'){endx=i;endy=j;}
}
}
if(beginx==endx&&beginy==endy)
{
printf("0\n");
return 0;
}
bfs();
if(!flag) printf("-1\n");
}
相关文章推荐
- C++广度优先搜索算法之迷宫问题
- C++广度优先搜索算法之鸣人与佐助
- C++广度优先搜索算法之献给阿尔吉侬的花束
- C++广度优先搜索算法之Dungeon Master
- C++广度优先搜索算法之走迷宫
- 图基本算法介绍:广度优先搜索、深度优先搜索、拓扑排序、强连通分支(算法篇)
- 【游戏编程】AI-迷宫寻路算法-深度优先搜索和广度优先搜索
- 广度优先搜索C++练习题HDU 1242 Rescue
- C++ Boost graph 深度(广度)优先算法示例
- 算法——基本的图算法:广度优先搜索、深度优先搜索
- 广度优先搜索(BFS)算法
- 【算法入门】广度/宽度优先搜索(BFS)
- 算法起步之广度优先搜索
- 图基本算法介绍:广度优先搜索、深度优先搜索、拓扑排序、最强连通分支(概念篇)
- 【算法小总结】广度优先搜索剖析
- 广度优先搜索写的连通区域标记算法
- 广度优先搜索算法-计算最短距离
- 《算法导论》中广度优先搜索的实现 c++
- 小游戏系列算法之五广度优先搜索,双向广搜,八数码,华容道
- 广度优先搜索算法_基于邻接表