迷宫问题
Description
请解决迷宫问题,并打印出一条从入口到出口的路径。
前进方向:按照下-右-上-左的顺序。
用使用DFS解答该题。
Input
前8行输入一个8*8的int二维数组,其中0表示通路,1表示墙。
第9行输入入口坐标。
第10行输入出口坐标。
Output
输出8*8的int二维数组,其中2表示路径,1表示墙,0表示未经过的点。
Sample Input 1
0 0 1 0 0 0 1 0
0 0 1 0 0 0 1 0
0 0 0 0 1 1 0 0
0 1 1 1 0 0 0 0
0 0 0 1 0 0 0 0
0 1 0 0 0 1 0 0
0 1 1 1 0 1 1 0
1 1 0 0 0 0 0 0
0 0
0 7
Sample Output 1
2 0 1 0 0 0 1 2
2 0 1 0 0 0 1 2
2 0 0 0 1 1 0 2
2 1 1 1 0 0 0 2
2 2 2 1 0 0 0 2
0 1 2 2 2 1 0 2
0 1 1 1 2 1 1 2
1 1 0 0 2 2 2 2
思路:
-
定义迷宫和方向:
- 使用一个二维数组
maze
来表示迷宫,其中0表示通路,1表示墙壁,2表示路径。 - 定义一个方向数组
dir
,表示在四个方向上的移动:下、右、上、左。
- 使用一个二维数组
-
标记路径:
markPath
函数用于标记路径,将迷宫中的特定位置标记为2,表示路径。
-
判断点的有效性:
isValid
函数用于判断某个点是否在迷宫内且是通路。
-
深度优先搜索(DFS):
dfs
函数是核心的深度优先搜索算法。从起始点开始,尝试向四个方向之一移动。- 对于每个可行的移动,标记当前位置为路径,然后递归调用DFS。
- 如果找到目标点,返回
true
,表示路径找到。如果在某个方向上找不到路径,回溯到上一个节点,尝试其他方向。 - 在回溯时,需要取消当前位置的标记,以便在其他方向上重新尝试。
-
主函数:
- 通过主函数输入迷宫数据,起始点和目标点的坐标。
- 调用
dfs
函数解决迷宫问题。 - 如果找到路径,输出标记过的迷宫,否则输出"No solution found!"。
#include<iostream>
using namespace std;
int maze[8][8];//定义一个8*8的迷宫 用来存放三种情况 0通路 1墙壁 2路径
int direction[4][2]={{1,0},{0,1},{-1,0},{0,-1}};
void markPath(int x,int y)//题目所给的是一个 标记好 0 1 的迷宫,其中0是通路,1是墙壁,而我要做的是通过DFS,将一条通路用2标记出来,也就是做的把0变成2
{
maze[x][y]=2;
}
bool isValid(int x,int y)//这个函数起到的作用是检查这个点,是否可以被标记为一条通路,需要符合两个条件,在迷宫内,第二个 它是通路
{
if((x>=0)&&(x<8)&&(y>=0)&&(y<8)&&maze[x][y]==0)
return 1;
else
return 0;
}
bool dfs(int x,int y,int exitX,int exitY)//深度优先搜索,一共需要两个点的参数,一个是当前位置,一个是最后要退出的点的位置
{
if((x==exitX)&&(y==exitY))//如果递归到了最后的出口,那就先将这最后的通路标记为2,之后退出,此时的遍历的矩阵也已经完成了标记
{
markPath(x,y);
return true;
}
for(int i=0;i<4;i++)//这个循环将从四个方向:下 右 上 左展开遍历
{
int newX=x+direction[i][0];//new 一个点 横坐标是x,纵坐标是y
int newY=y+direction[i][1];//改变的顺序一次是向 下(1,0)右(0,1)上(-1,0)左(0,—1)
if(isValid(newX,newY))//检查当前要放置为2的点是否可行
{
markPath(x,y);
if(dfs(newX,newY,exitX,exitY))//如果是一直在通路上 那就会一步步递归进入,直到出口,再通过一次次return true返回回来,最后回到main函数
{
return true;
}
maze[x][y]=0;//执行这一步是因为下一个点是没法移动到的
}
}
return false;//这里false有两种情况 一种是遇到墙壁了(isvalid函数不符合)还有一种是上一行maze[x][y]被赋值为0的情况
}
int main()
{
for(int i=0;i<8;i++)//读取迷宫
{
for(int j=0;j<8;j++)
{
cin>>maze[i][j];
}
}
int entryx,entryy;//读取入口的坐标
int exitX,exitY;//读取出口的坐标
cin>>entryx>>entryy;
cin>>exitX>>exitY;
if(dfs(entryx,entryy,exitX,exitY))
{//符合要求 输出结果
for(int i=0;i<8;i++)
{
for(int j=0;j<8;j++)
{
cout<<maze[i][j]<<" ";
}
cout<<endl;
}
}
else
cout<<"No solution found!"<<endl;
return 0;
}