给定一个大小为NxM的迷宫。迷宫有通道和墙壁组成每一步可以向邻接的上下左右四格的通道移动。请求出起点到终点所需的最小步数。*表示障碍物,.表示可以通道。本题假定从起点一定可以移动到终点。
限制条件:
N,M《 100.
样例
输入
5 5
.....
.*.*.
.*S*.
.***.
...T*
2 2 4 3
输出
11
BFS解法:
#include<stdio.h>
#include<queue>
using namespace std;
char maze[101][101];
int n,m;
typedef struct node
{
int x,y;//位置(x,y)
int step;//从起点到达某位置需要的最少步数
}node;
node Start,End,temp,top;
int a[4]={0,0,1,-1};//表示上下左右位移
int b[4]={1,-1,0,0};//
int flag[101][101]={false};//记录某个位置是否已入过队列
int BFS()
{
queue<node> que;
que.push(Start);
while(!que.empty())
{
top=que.front();
que.pop();
if(top.x==End.x&&top.y==End.y)
return top.step;
for(int i=0;i<4;i++)
{
int curx=top.x+a[i];
int cury=top.y+b[i];
if(curx>=0&&curx<n&&cury>=0&&cury<m&&maze[curx][cury]!='*'&&flag[curx][cury]==false)//注意不能等于m 等于的话就越界了
{
temp.x=curx;
temp.y=cury;
temp.step=top.step+1;
que.push(temp);
flag[curx][cury]=true;
}
}
}
return -1;
}
int main()
{
scanf("%d%d",&n,&m);
for(int i=0;i<n;i++)
{
getchar();
for(int j=0;j<m;j++)
{
scanf("%c",&maze[i][j]);
}
maze[i][m+1]='\0';
}
scanf("%d%d%d%d",&Start.x,&Start.y,&End.x,&End.y);
Start.step=0;
printf("%d\n",BFS());
return 0;
}
DFS解法:
#include<stdio.h>
char maze[100][100];
int startX,startY,endX,endY,n,m;
int flag[100][100];
int move[4][2] = {{-1,0},{0,-1},{1,0},{0,1}};
int step;
int ans = 100000;
void dfs(int x,int y,int step)
{
if(maze[x][y] == 'T')
{
if(step<ans)
{
ans = step;
}
return;
}
for(int i=0;i<4;i++)
{
int curx = x + move[i][0];
int cury = y + move[i][1];
if(curx>=0&&curx<n&&cury>=0&&cury<m&&flag[curx][cury]==false&&maze[curx][cury]!='*')
{
flag[curx][cury] = true;
dfs(curx,cury,step+1);
flag[curx][cury] = false;
}
}
}
int main()
{
scanf("%d%d",&n,&m);
for(int i=0;i<n;i++) scanf("%s",&maze[i]);
scanf("%d%d%d%d",&startX,&startY,&endX,&endY);
dfs(startX,startY,0);
printf("%d",ans);
return 0;
}