迷宫路径(bfs和dfs)
来源:互联网 发布:21网夏老师c语言视频 编辑:程序博客网 时间:2024/06/13 22:17
深度优先搜索
#include<cstdio>
#include<iostream>
using namespace std;
#include<cstring>
#include<algorithm>
#include<queue>
#define N 100
int move[4][2]={
0,1,1,0,0,-1,-1,0
};
struct node
{
int x,y,step;
}fa[N][N],road[N*N];
struct node start,next,head;
queue<node>Q;
int n,m,sx,sy,dx,dy;
char a[N][N];
int vis[N][N];
int can[N][N];
void bfs(int x,int y)
{
vis[x][y]=1;
start.x=x;start.y=y;
Q.push(start);
while(!Q.empty())
{
head=Q.front();
Q.pop();
/* printf("-->%d %d",head.x,head.y);
printf("\n");*/
if(head.x==dx&&head.y==dy)return;//找到终点,return
for(int i=0;i<=4;i++)
{
next.x=head.x+move[i][0];
next.y=head.y+move[i][1];
if(next.x<0||next.x>=n||next.y<0||next.y>=m)continue;
if(can[next.x][next.y]&&!vis[next.x][next.y])
{
vis[next.x][next.y]=1;
next.step=head.step+1;
fa[next.x][next.y].x=head.x;//记录路径
fa[next.x][next.y].y=head.y;
Q.push(next);
}
}
}
}
int main()
{
while(~scanf("%d%d",&n,&m))
{
memset(vis,0,sizeof(vis));
memset(can,0,sizeof(can));
for(int i=0;i<n;i++)scanf("%s",a[i]);
for(int i=0;i<n;i++)
for(int j=0;j<m;j++)
if(a[i][j]=='S'){
sx=i;sy=j;
}
else if(a[i][j]=='D'){
dx=i;dy=j;can[i][j]=1;
}
else if(a[i][j]=='.'){
can[i][j]=1;
}
else if(a[i][j]=='X'){
can[i][j]=0;
}
fa[sx][sy].x=fa[sx][sy].y=-1;
bfs(sx,sy);
printf("%d\n",head.step);//输出最短步数
int k=0,t;
int xx=head.x;
int yy=head.y;
do
{
road[k].x=xx;
road[k++].y=yy;
t=xx;
xx=fa[xx][yy].x;
yy=fa[t][yy].y;
}while(fa[xx][yy].x!=-1);
printf("%d %d\n",sx,sy);
for(int i=k-1;i>=0;i--)printf("%d %d\n",road[i].x,road[i].y);//输出路径
}
}
/*
样例:
4 4
S.X.
..X.
..XD
....
3 4
S.X.
..X.
...D
*/
广度优先搜索
/*#include<queue>
struct node
{
int x,y,step;
bool operator<(const node&that)const{
return step>that.step;
}
}//优先队列
#include<cstdio>
#include<iostream>
using namespace std;
#include<cstring>
#include<algorithm>
#include<queue>
#define N 100
int move[4][2]={
0,1,1,0,0,-1,-1,0
};
char a[N][N];
int step[N][N],can[N][N],vis[N][N];//step记录步数,can记录能否通行,vis记录是否已经走过
int n,m,sx,sy,dx,dy,ans;
void dfs(int x,int y)
{
int tx,ty;
vis[x][y]=1;
if(x==dx&&y==dy)
{
if(step[x][y]<ans)ans=step[x][y];
return;
}
for(int i=0;i<4;i++)
{
tx=x+move[i][0];
ty=y+move[i][1];
if(tx<0||tx>=n||ty<0||ty>=m)continue;
if(!vis[tx][ty]&&can[tx][ty])
{
vis[tx][ty]=1;
step[tx][ty]=step[x][y]+1;
dfs(tx,ty);
step[tx][ty]=step[x][y]-1;
vis[tx][ty]=0;
}
}
}
int main()
{
while(~scanf("%d%d",&n,&m))
{
memset(vis,0,sizeof(vis));
memset(step,0,sizeof(step));
ans=100000000;
for(int i=0;i<n;i++)scanf("%s",a[i]);
for(int i=0;i<n;i++)
for(int j=0;j<m;j++)
if(a[i][j]=='S'){
sx=i;sy=j;
}
else if(a[i][j]=='D'){
dx=i;dy=j;can[i][j]=1;
}
else if(a[i][j]=='.'){
can[i][j]=1;
}
else if(a[i][j]=='X'){
can[i][j]=0;
}
dfs(sx,sy);
printf("%d\n",ans);
}
}
- 迷宫路径(bfs和dfs)
- 迷宫最短路径dfs和bfs代码分析
- poj 迷宫问题(路径记录)(DFS,BFS)
- 迷宫---DFS和BFS解法
- BFS和DFS的差别,BFS实现迷宫最短路径
- 走迷宫sdut1269(附带dfs求所有路径与bfs求最佳路径)
- poj3984(BFS)迷宫路径
- FOJ 1205 小鼠迷宫问题【BFS+dfs回溯查找路径】
- 模拟求解迷宫问题(DFS+BFS)
- H - 迷宫问题 POJ3984 (BFS+DFS)
- POJ 3984 迷宫问题 (DFS+BFS)
- HDU 1728 逃离迷宫(BFS+DFS)
- 迷宫问题、最短路(BFS,DFS)
- 迷宫系列(二)搜索、BFS、DFS
- 迷宫问题 dfs bfs
- BFS,DFS,迷宫
- 挑战ACM迷宫(DFS,BFS,BFS+优先队列)
- BFS和DFS路径存储和打印
- LeetCode——Populating Next Right Pointers in Each Node
- java基础第八天
- 谷歌地图服务
- ZOJ 3524 Crazy Shopping(拓扑+DP)
- 陈力:传智播客古代 珍宝币 泡泡龙游戏开发第十讲:深入理解盒子模型
- 迷宫路径(bfs和dfs)
- android介绍
- 在linux下安装jdk
- PAT (Advanced Level) 1005. Spell It Right (20) string转int,哈希
- Property follows Cocoa naming convention for returning 'owned' objects 错误解决办法
- Scrapy中用cookie模拟登陆新浪微博
- iOS之新建工程上下出现黑色块
- 测试String类的intern方法
- CSS-动画