描述
在神秘的迷宫中探险吧!你需要找到通往出口的路径。迷宫的大小为n(3<n<=10),迷宫的外围被围墙包围,你不能穿越它。入口位于(1, 1),出口位于(n-2, n-2)。迷宫中0代表通路,1代表墙壁。请你输出从入口到出口的可行路径,如果没有通路,则输出“NO”。如下这样一个迷宫:
对应的二维数组表示:
要求迷宫中只允许在水平或上下四个方向的空位上行走,走过的位置不能重复走,请按向右、向下、向左、向上的顺序深度优先搜索。
输入
一个整数n表示迷宫大小,接下来是一个n行n列的二维数组,0代表通路,1代表墙壁。
输出
从入口到出口可行路径每个位置的行列下标,每个位置间用逗号“,”分隔,如果没有通路,则输出“NO”。
输入样例 1
4
1 1 1 1
1 0 1 1
1 0 0 1
1 1 1 1
(注意最后有一行空行)
输出样例1
(1,1)(2,1)(2,2)
代码实现
#include<iostream>
#include<stdio.h>
#include<vector>
using namespace std;
bool maze[15][15];
int n;
typedef pair<int,int> PII;
vector<PII> path;
int dx[4]={0,1,0,-1};
int dy[4]={1,0,-1,0};
bool dfs(int x,int y)
{
if(x==n-2&&y==n-2)
{
//path.push_back({n-2,n-2});
for(auto i:path)
{
printf("(%d,%d)",i.first,i.second);
}
return true;
}
for(int i=0;i<4;i++)
{
int tx=x+dx[i],ty=y+dy[i];
if(tx<n-1&&ty<n-1&&tx>0&&ty>0)
if(maze[tx][ty]==0)
{
path.push_back({tx,ty});
maze[tx][ty]=true;
if(dfs(tx,ty))return true;
//maze[tx][ty]=false;
path.pop_back();
}
}
return false;
}
int main()
{
cin>>n;
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)scanf("%d",&maze[i][j]);
path.push_back(make_pair(1,1));
maze[1][1]=1;
if(!dfs(1,1))printf("NO\n");
//cin>>n;
return 0;
}
注意对于这个题目,已经搜索过的方格可以直接标为1,因为先前的搜索已经证明从该点出发无法到达终点,所以回溯时不需要恢复现场,即不用再次搜索该点,相当于剪枝。