原题链接:马走日
解题思路:
注意事项:
参考代码:
#include "bits/stdc++.h"
using namespace std;
// 全局变量声明
int n, m, x, y, kkk = 0; // n和m表示棋盘的大小,x和y表示起始位置,kkk用于计数
int a[15][15]; // 棋盘数组
int xxx[10] = {-2, -1, 2, 1, -2, -1, 2, 1}; // 马移动的x方向偏移量
int yyy[10] = {-1, -2, -1, 2, 1, 2, 1, -2}; // 马移动的y方向偏移量
void dfs(int xx, int yy, int k) {
// 如果已经走完所有格子,增加计数器并返回
if (k == n * m) {
kkk++;
return;
}
// 遍历所有可能的马移动方向
for (int i = 0; i < 8; i++) {
int X = xx + xxx[i]; // 计算新的x坐标
int Y = yy + yyy[i]; // 计算新的y坐标
// 检查新坐标是否在棋盘范围内且该位置未被访问过
if (X >= 0 && X < n && Y >= 0 && Y < m && a[X][Y] == 1) {
a[X][Y] = 0; // 标记该位置为已访问
dfs(X, Y, k + 1); // 递归调用dfs继续搜索
a[X][Y] = 1; // 回溯,恢复该位置为未访问状态
}
}
}
int main() {
int t; // 测试用例数量
cin >> t; // 输入测试用例数量
while (t--) {
kkk = 0; // 初始化计数器
cin >> n >> m >> x >> y; // 输入棋盘大小和起始位置
// 初始化棋盘,将所有位置设为未访问状态
for (int i = 0; i < 15; i++) {
for (int j = 0; j < 15; j++) {
a[i][j] = 1;
}
}
a[x][y] = 0; // 将起始位置设为已访问状态
dfs(x, y, 1); // 从起始位置开始进行深度优先搜索
cout << kkk << endl; // 输出结果
}
return 0;
}0.0分
0 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复