题目要求:
输入三个数,n m; n和m表示迷宫的n行m列;当输入m和n为0时结束输入。
起点用‘S'表示,终点用'D'表示,墙壁用’X,' . '表示可走路径。
例如:
输出:
如果能找到路径到出口则输出路径,否则输出“NO”!
解题思路:
使用深度优先搜索:dfs
#include <iostream>
using namespace std;
int m,n;
char maze[100][100];
bool mark[100][100];
bool in(int x,int y)
{
return 0 <= x && x < n && 0 <= y && y < m;
}
bool dfs(int dx,int dy)//深度优先算法
{
if(maze[dx][dy]=='D')
return true;
maze[dx][dy]='A';
mark[dx][dy]=true;
int x,y;
x=dx;y=dy+1;//向右
if(in(x,y) && maze[x][y]!='X' && !mark[x][y])
{
if(dfs(x,y)) return true;
}
x=dx+1; y=dy;//向下
if(in(x,y) && maze[x][y]!='X' && !mark[x][y])
{
if(dfs(x,y)) return true;
}
x=dx;y=dy-1;//向左
if(in(x,y) && maze[x][y]!='X' && !mark[x][y])
{
if(dfs(x,y)) return true;
}
x=dx-1;y=dy;//向上
if(in(x,y) && maze[x][y]!='X' && !mark[x][y])
{
if(dfs(x,y)) return true;
}
maze[dx][dy]='.';
mark[dx][dy]=false;
return false;
}
int main()
{
int x,y;
while(cin>>n>>m)
{
if(!n &&!m &&!m) break;
for(int i=0;i<n;i++)
for(int j=0;j<m;j++)
cin>>maze[i][j];
for(int i=0;i<n;i++)
for(int j=0;j<m;j++)
{
if(maze[i][j]=='S')
{x=i;y=j;}
}
if(dfs(x,y))
{
for(int i=0;i<n;i++)
{
cout<<endl;
for(int j=0;j<m;j++)
{
cout<<maze[i][j];
}
}
}
else
cout<<"No"<<endl;
}
return 0;
}