使用 C++ 实现马在棋盘上不重复遍历的解决方案
以下是使用 C++ 实现的代码,用于解决在 `n * n` 棋盘上,马从指定位置出发,不重复地走遍棋盘上每一个点的问题: ```cpp #include <iostream> #include <iomanip> #include <cstring> using namespace std; const int MAXN = 6; int n; int board[MAXN][MAXN]; int dx[8] = {2, 1, -1, -2, -2, -1, 1, 2}; int dy[8] = {1, 2, 2, 1, -1, -2, -2, -1}; // 深度优先搜索函数 bool dfs(int x, int y, int step) { // 判断当前位置是否越界、是否已经走过 if (x < 0 || x >= n || y < 0 || y >= n || board[x][y] != 0) { return false; } // 标记当前位置为已走过,并记录步数 board[x][y] = step; // 如果已经走完所有格子,返回 true if (step == n * n) { return true; } // 尝试 8 个可能的方向 for (int i = 0; i < 8; i++) { int nx = x + dx[i]; int ny = y + dy[i]; if (dfs(nx, ny, step + 1)) { return true; } } // 如果 8 个方向都走不通,回溯 board[x][y] = 0; return false; } int main() { cin >> n; int startX, startY; cin >> startX >> startY; // 初始化棋盘 memset(board, 0, sizeof(board)); // 从起始位置开始深度优先搜索 if (dfs(startX - 1, startY - 1, 1)) { // 输出棋盘 for (int i = 0; i < n; i++) { for (int j = 0; j < n; j++) { cout << setw(3) << board[i][j]; if (j < n - 1) { cout << " "; } } cout << endl; } } else { cout << "NO answer!" << endl; } return 0; } ``` ### 代码解释: 1. **全局变量**: - `MAXN`:棋盘的最大边长。 - `n`:棋盘的实际边长。 - `board`:二维数组,用于记录棋盘上每个格子的状态。 - `dx` 和 `dy`:马走日字的 8 个可能方向。 2. **dfs 函数**: - 深度优先搜索函数,用于尝试从当前位置出发,找到一条不重复的路径。 - 如果当前位置越界或已经走过,返回 `false`。 - 标记当前位置为已走过,并记录步数。 - 如果已经走完所有格子,返回 `true`。 - 尝试 8 个可能的方向,如果某个方向可以走通,返回 `true`。 - 如果 8 个方向都走不通,回溯,将当前位置标记为未走过。 3. **main 函数**: - 读取输入的棋盘边长 `n` 和马的起始位置。 - 初始化棋盘。 - 从起始位置开始深度优先搜索。 - 如果找到路径,输出棋盘;否则,输出 `NO answer!`。 ######[AI问答 | 873点数解答 | 2026-03-28 21:07:22]
- 导出功能优化:解决多次导出、过程异常、失败提示及完成通知问题 (DeepSeek | 1点数解答 | 2025-02-12 17:35:54)188
- Python 实现球类:精准计算半径、表面积与体积,附输入验证与异常处理!(阿里通义 | 261点数解答 | 2024-11-28 21:19:39)346
- JSP 实现商品展示模块:分页、搜索、交互与美观界面全搞定!(字节豆包 | 19点数解答 | 2024-12-13 15:00:43)338
- JS 巧用 for in 循环逐行输出对象 key:value,还有关键判断!( | 208点数解答 | 2024-05-20 22:15:55)363
- PyCharm 中用 Selenium 编写自动化测试脚本,轻松登录 eShop 测试平台并点击“我的订单”(字节豆包 | 304点数解答 | 2024-11-06 15:38:30)434
- 51 单片机:定时器 0 实现 8 个 LED 循环点亮,附代码及优化建议(字节豆包 | 1193点数解答 | 2024-12-27 15:10:29)316
- 用 JS 中 for 循环实现 1 到 100 相加并输出结果到页面的完整代码 ( | 240点数解答 | 2024-05-20 22:11:29)467
- 用 JS 的 while 循环实现 1 到 100 相加并输出到页面的代码揭秘( | 47点数解答 | 2024-05-20 22:16:48)357
- Vue.js 与 Matter.js 碰撞:轻松实现物理模拟全攻略 (讯飞星火 | 522点数解答 | 2024-05-29 22:26:06)432
- Python程序:多人物9参数雷达图生成,参数折合百分制展示(字节豆包 | 873点数解答 | 2026-01-11 21:07:42)42
- C++实现多对象9参数雷达图绘制:输入满值后自动折合百分制(字节豆包 | 801点数解答 | 2026-01-11 21:09:16)49
- Python实现:多人员9参数雷达图生成程序,自由添加人员并折算分数(字节豆包 | 467点数解答 | 2026-01-11 21:10:04)35