1 条题解
-
0
// [1] 全局变量定义 #include<bits/stdc++.h> using namespace std; int n; // 迷宫尺寸,为n*n的方阵 char crr[30][30]; // 存储迷宫地图,'0'为可走区域,非'0'为障碍 int arr[30][30]={}; // 访问标记数组,1表示已访问,0表示未访问,防止重复走 int dx[4] = {0, -1, 0, 1}; // x轴方向偏移量,对应搜索顺序:左、上、右、下 int dy[4] = {-1, 0, 1, 0}; // y轴方向偏移量,对应搜索顺序:左、上、右、下 struct stu{ int l,r; // 存储坐标结构体,l对应x轴,r对应y轴 }; vector<stu> dp; // 存储当前搜索路径的坐标(除起点外) int flag=1; // 找到路径的标记,1表示未找到,0表示已找到并终止所有搜索 // [5] 深度优先搜索函数:从坐标(x,y)开始搜索迷宫路径 void dfs(int x,int y){ // [6] 剪枝:若已找到路径,直接返回,终止后续所有递归 if(flag==0) return ; // [7] 递归终止条件:到达终点(n,n)且未找到过路径 if(x==n && y==n && flag==1){ flag=0; // 标记为已找到路径,阻止其他分支搜索 cout<<"("<<1<<","<<1<<")"; // 直接输出起点坐标(1,1) // 循环输出后续路径,dp中存储的是起点到终点的中间+终点坐标 for(int i=0;i<dp.size();i++){ cout<<"->"<<"("<<dp[i].l<<","<<dp[i].r<<")"; } return; } // [8] 按左、上、右、下的固定顺序遍历四个方向 for(int i=0;i<4;i++){ int tx=x+dx[i]; // 计算新位置的x轴坐标 int ty=y+dy[i]; // 计算新位置的y轴坐标 // [9] 判断新坐标是否合法:在迷宫边界内、可走、未被访问 if(tx>=1 && tx<=n && ty>=1 && ty<=n && crr[tx][ty]=='0' && arr[tx][ty]==0){ arr[tx][ty]=1; // 标记新坐标为已访问 dp.push_back({tx,ty}); // 将新坐标加入当前路径 dfs(tx,ty); // 递归搜索新坐标位置 arr[tx][ty]=0; // 回溯:取消新坐标的访问标记 dp.pop_back(); // 回溯:将新坐标从当前路径中移除 } } } int main() { // [2] 输入处理:读取迷宫尺寸和地图信息 cin>>n; // 读取n*n迷宫的尺寸n // 双层循环读取n行n列的迷宫地图 for(int i=1;i<=n;i++){ for(int j=1;j<=n;j++){ cin>>crr[i][j]; // 读取每个位置的地图值 } } // [3] 初始化起点:标记(1,1)为已访问,避免重复访问起点 arr[1][1]=1; // [4] 从迷宫起点(1,1)开始深度优先搜索 dfs(1,1); return 0; }
- 1
信息
- ID
- 1299
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- 递交数
- 4
- 已通过
- 1
- 上传者