1 条题解

  • 0
    @ 2026-2-4 17:54:21
    #include <bits/stdc++.h>
    using namespace std;
    
    // [1] 坐标结构体,保留原有命名:h代表行坐标x,z代表列坐标y
    struct stu{
    	int h,z; // h=行x,z=列y,保留原有命名
    };
    // [2] 路径存储数组,按访问顺序保存从起点到当前点的所有坐标节点
    vector<stu> arr;
    // [3] 马跳顺时针方向的行偏移量(已修正为正确顺序,无需修改)
    int dx[4]={2,1,-1,-2};
    // [4] 马跳顺时针方向的列偏移量,与dx数组一一对应,保证顺时针搜索
    int dy[4]={1,2,2,1};
    // [5] 访问标记二维数组,brr[x][y]=1表示坐标(x,y)已访问,避免路径重复
    int brr[100][100]={}; 
    // [6] 有效路径计数变量,记录找到的路径序号,初始值为1
    int sum=1; 
    
    // 深度优先搜索(DFS)核心函数,主函数调用时跳转至此注释
    void dfs(int x,int y){
        // [10] 递归终止条件:到达目标终点(4,8),执行当前有效路径的输出逻辑
    	if(x==4 && y==8){
            // [11] 输出路径序号+起点坐标,按「行,列」格式展示
    		cout<<sum<<":"<<arr[0].h<<","<<arr[0].z;
            // [12] 循环遍历路径数组,拼接输出后续所有坐标节点,格式「->行,列」
    		for(int i=1;i<arr.size();i++){
    			cout<<"->"<<arr[i].h<<","<<arr[i].z;
    		}
    		cout<<endl; // [13] 换行分隔不同路径,保证输出整洁
    		sum++; // [14] 路径序号自增,为下一条有效路径计数
    		return; // [15] 递归返回,结束当前路径的后续搜索逻辑
    	}
    	
        // [16] 顺时针遍历4个马跳方向,按序进行深度优先递归搜索
    	for(int i=0;i<4;i++){
    		int tx=x+dx[i]; // [17] 计算下一个候选点的行坐标
    		int ty=y+dy[i]; // [18] 计算下一个候选点的列坐标
            // [19] 候选点合法性判断:行0~4、列1~8,且该点未被访问(已修正行范围)
    		if(tx>=0 && tx <=4 && ty>=1 && ty <=8 && brr[tx][ty]==0){
    			brr[tx][ty]=1; // [20] 标记候选点为已访问,防止重复遍历
    			arr.push_back({tx,ty}); // [21] 将候选点加入路径数组,记录当前路径
    			dfs(tx,ty); // [22] 递归调用DFS,搜索候选点出发的后续所有路径
    			arr.pop_back(); // [23] 路径回溯:弹出当前点,恢复上一步路径状态(核心修正)
    			brr[tx][ty]=0; // [24] 标记回溯:取消候选点访问状态,恢复可遍历
    		}
    	}
    }
    
    // [7] 主函数,程序唯一执行入口
    int main(){
    	arr.push_back({0,0}); // [8] 将起点坐标(0,0)加入路径数组,完成路径初始化
    	brr[0][0]=1; // [9] 标记起点为已访问,避免后续重复遍历(已正确设置,无需修改)
    	dfs(0,0); // 调用DFS核心函数,跳转至[10]开始注释DFS逻辑
    	return 0; // [25] 程序正常执行完毕,返回终止状态码0
    }
    
    • 1

    信息

    ID
    1287
    时间
    1000ms
    内存
    256MiB
    难度
    10
    标签
    递交数
    6
    已通过
    1
    上传者