题目描述
给出一个n*n的迷宫矩阵示意图,从起点[0,0]出发,寻找路径到达终点[n-1, n-1]。
本题使用摸墙算法走迷宫。摸墙走算法也称绕墙走算法,是一种运用左手/右手法则进行迷宫搜索的初级算法。
如果迷宫是简单连通的,即迷宫的墙总是相互相连的或与迷宫的外轮廓相连,那么迷宫的搜索者从起点开始将一只手扶在墙面前行,总能保证不会迷失并且找到迷宫中存在的出口。
现假设使用左手法则饶墙走迷宫,即左手不离墙。且假设总能走到出口。输出从起点到终点的路径。
输入
第一行输入t,表示有t个迷宫
第二行输入n,表示第一个迷宫有n行n列
第三行起,输入迷宫每一行的每个方格的状态,0表示可通过,1表示不可通过
以此类推输入下一个迷宫
输出
对每个迷宫,输出从起点 [0,0] 到终点[n-1,n-1] 的路径。
样例输入
2
4
0 1 1 0
0 1 1 1
0 0 0 1
0 0 0 0
8
0 0 0 1 1 1 1 1
1 0 0 0 1 0 0 1
1 0 0 0 1 0 0 0
1 1 0 0 0 0 0 1
0 0 1 1 0 1 1 0
0 0 0 0 0 0 1 1
1 1 1 1 1 0 0 1
0 0 0 0 1 0 0 0
样例输出
[0,0]–[1,0]–[2,0]–[2,1]–[2,2]–
[3,2]–[3,3]
[0,0]–[0,1]–[0,2]–[1,2]–[1,3]–
[2,3]–[3,3]–[3,4]–[3,5]–[2,5]–
[1,5]–[1,6]–[2,6]–[2,7]–[2,6]–
[3,6]–[3,5]–[3,4]–[4,4]–[5,4]–
[5,5]–[6,5]–[6,6]–[7,6]–[7,7]
题目分析:
首先我们要先理解题目所说的左手摸墙算法,即现判断左手有没有墙,如果没有,则左走,否则把手伸在前方,判断前方是否有墙,如果没有,则向前走,否则右走。最后,如果左、前、右都不能走,则退回一步。
然后,我们要思考从起点到终点的实现方法(难点):
根据左手摸墙方法,我们可以记录每一步的方向current_dir和定义一个方向数组dir[4][2]={-1,0,1,0,1,0,0,-1},以便判断下一布的左手、前方、右手、后方(-1、0、1、2)的坐标.
所以,下一步的坐标也就确定了
next_dir=(current_dir+t+4)%4;//加4是为了防止<0的情况,%4是为了防止next_dir>=4的情况
next_x=current_x+dir[next_dir][0];
next_y=current_y+dir[next_dir][1];
其中t是从-1到1(因为是先判断左边,而-1代表左边,0代表向前,1表示向右)
当下一步走出迷宫时,就可以终止了
代码实现:
#include
using namespace std;
int n,sum,have_find;//sum用于计算输出的个数,用于换行;have_find用于标记走出迷宫
int a[100][100]= {-1};//迷宫数组,用来储存迷宫
int dir[4][2]= {-1,0,0,1,1,0,0,-1};//方向数组,方便记录四个方向
bool is_in_board(int x,int y)//用来判断(x,y)是否在边界里面
{
if(x>=0&&x=0&&yreturn true;
return false;
}
bool isValid(int x,int y)//用来判断(x,y)是否可以走
{
if(is_in_board(x,y)&&a[x][y]==0)
return true;
return false;
}
void seekpath(int current_x,int current_y,int current_dir)
{
int next_x,next_y,t=-1,next_dir;//t==-1表示从左手开始
for(t=-1;t<=2;t++)
{
next_dir=(current_dir+t+4)%4;//加4是为了防止<0的情况,%4是为了防止next_dir>=4的情况
next_x=current_x+dir[next_dir][0];
next_y=current_y+dir[next_dir][1];
if(isValid(next_x,next_y))
{
if(next_x==n-1&&next_y==n-1)//如果下一个(x,y)表示走出迷宫,则说明找到出口
{
have_find=1;
cout<<"["<","<"]"<return ;
}
cout<<"["<","<"]"<<"--";
sum++;
if(sum%5==0)
cout<if(have_find)
return ;
}
}
}
int main()
{
int t;
cin>>t;
while(t--)
{
have_find=0;
sum=1;
cin>>n;//输入迷宫大小
int i,j;
for(i=0; ifor(j=0; jcin>>a[i][j];
cout<<"[0,0]--";
seekpath(0,0,2);
}
return 0;
}
由于作者水平有限,如有什么不对的地方,望指正!