C语言实现任意位置开始的马踏棋盘问题(深度优先搜索)
C语言实现任意位置开始的马踏棋盘问题(深度优先搜索)
马踏棋盘问题是一个经典的算法问题,要求马从棋盘上的任意位置出发,遍历棋盘上的所有位置,且每个位置只访问一次。本文将使用 C 语言代码实现该问题,并使用深度优先搜索算法进行求解。
代码实现
#include <stdio.h>
#include <stdbool.h>
#define N 8
int dx[8] = {2, 1, -1, -2, -2, -1, 1, 2};
int dy[8] = {1, 2, 2, 1, -1, -2, -2, -1};
bool isSafe(int x, int y, int chessboard[N][N]) {
return (x >= 0 && x < N && y >= 0 && y < N && chessboard[x][y] == -1);
}
void printSolution(int chessboard[N][N]) {
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++) {
printf("%2d ", chessboard[i][j]);
}
printf("
");
}
}
bool solveKTUtil(int x, int y, int movei, int chessboard[N][N]) {
if (movei == N * N) {
printSolution(chessboard);
return true;
}
for (int k = 0; k < 8; k++) {
int nextX = x + dx[k];
int nextY = y + dy[k];
if (isSafe(nextX, nextY, chessboard)) {
chessboard[nextX][nextY] = movei;
if (solveKTUtil(nextX, nextY, movei + 1, chessboard))
return true;
else
chessboard[nextX][nextY] = -1;
}
}
return false;
}
void solveKT() {
int chessboard[N][N];
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++) {
chessboard[i][j] = -1;
}
}
int startX, startY;
printf("Enter the starting position (0-7): ");
scanf("%d %d", &startX, &startY);
chessboard[startX][startY] = 0;
if (!solveKTUtil(startX, startY, 1, chessboard)) {
printf("Solution does not exist.
");
}
}
int main() {
solveKT();
return 0;
}
代码解析
代码中使用了以下数据结构和函数:
chessboard:一个 8x8 的二维数组,用于表示棋盘上每个位置的访问顺序。初始时,所有位置都被设置为 -1,表示未访问过。dx和dy:两个数组,分别存储了马在棋盘上的八个方向的横向和纵向位移。isSafe:判断给定位置是否可以被马访问的函数。该函数判断给定位置是否在棋盘范围内,并且该位置是否已经被访问过。printSolution:打印棋盘上马的移动路径的函数。solveKTUtil:递归函数,用于实现深度优先搜索算法。该函数从给定位置开始,尝试马在棋盘上的八个方向的移动,并递归调用自身,直到找到一个合法的遍历路径,或所有路径都尝试完。solveKT:主函数,用于获取用户输入的起始位置,并调用solveKTUtil函数解决马踏棋盘问题。
总结
以上代码使用深度优先搜索算法,可以有效地解决马踏棋盘问题,并且可以从棋盘上任意位置开始进行遍历。
注意: 该代码只针对 8x8 的棋盘,如果需要修改棋盘大小,需要调整代码中的 N 和 dx、dy 数组的定义。
原文地址: https://www.cveoy.top/t/topic/dYL 著作权归作者所有。请勿转载和采集!