6.3.1 骑士巡游代码实现
class KnightTour {
private:
vector<vector<int>> board;
int size;
const int dx[8] = {2,1,-1,-2,-2,-1,1,2};
const int dy[8] = {1,2,2,1,-1,-2,-2,-1};
bool isValid(int x, int y) {
return x >= 0 && x < size && y >= 0 && y < size && board[x][y] == -1;
}
int getDegree(int x, int y) {
int count = 0;
for (int i = 0; i < 8; i++) {
int nextX = x + dx[i];
int nextY = y + dy[i];
if (isValid(nextX, nextY)) count++;
}
return count;
}
bool dfs(int x, int y, int move) {
if (move == size * size) return true;
vector<pair<int,int>> nextMoves;
for (int i = 0; i < 8; i++) {
int nextX = x + dx[i];
int nextY = y + dy[i];
if (isValid(nextX, nextY)) {
int degree = getDegree(nextX, nextY);
nextMoves.push_back({degree, i});
}
}
sort(nextMoves.begin(), nextMoves.end());
for (auto& p : nextMoves) {
int i = p.second;
int nextX = x + dx[i];
int nextY = y + dy[i];
board[nextX][nextY] = move;
if (dfs(nextX, nextY, move + 1))
return true;
board[nextX][nextY] = -1;
}
return false;
}
public:
KnightTour(int n) : size(n) {
board = vector<vector<int>>(n, vector<int>(n, -1));
}
bool findTour(int startX, int startY) {
board[startX][startY] = 0;
return dfs(startX, startY, 1);
}
void printTour() {
for (int i = 0; i < size; i++) {
for (int j = 0; j < size; j++) {
cout << board[i][j] << "\t";
}
cout << endl;
}
}
};