1 条题解
-
0
#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 }
信息
- ID
- 1287
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- 递交数
- 6
- 已通过
- 1
- 上传者