1 条题解

  • 0
    @ 2026-2-1 14:19:59
    // [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
    上传者