骑士在C++的巡回演出

Knight's tour in C++

本文关键字:巡回演出 C++ 骑士      更新时间:2023-10-16

我有这个骑士之旅的问题,我必须解决。我必须输入一个 NxN 矩阵和骑士的坐标,其中 (1, 1) 是左下角的元素。现在程序工作正常,但是我的问题是任务指出可以有很多输入。这就是为什么我在 main 函数中添加了一个 while 循环(以连续获取输入并解决它们,但是在第一次输入后,程序不再允许我在控制台中写入(好像它阻止了),我唯一能做的就是停止控制台。你能帮我解决我的问题吗?提前谢谢。

#include <iostream>
using namespace std;
const int MAXN = 10;
const int MAXD = 10;
const int maxDiff = 8;
const int diffX[MAXD] = { 1, 1, -1, -1, 2, -2, 2, -2 };
const int diffY[MAXD] = { 2, -2, 2, -2, 1, 1, -1, -1 };
unsigned board[MAXN][MAXN];
unsigned newX, newY;
void printBoard(int n)
{
int i, j;
for (i = n; i > 0; i--) {
    for (j = 0; j < n; j++)
    {
        if (j == 0)
        {
            cout << board[i - 1][j];
        }
        else
        {
            cout << " " << board[i - 1][j];
        }
    }
    cout << endl;
}
}
void nextMove(int X, int Y, int i, int n)
{
int k;
board[X][Y] = i;
if (i == n * n) 
{ 
    printBoard(n); 
    return; 
}
for (k = 0; k < maxDiff; k++)
{
    newX = X + diffX[k]; newY = Y + diffY[k];
    if ((newX >= 0 && newX < n && newY >= 0 && newY < n) && (0 ==             board[newX][newY]))
    {
        nextMove(newX, newY, i + 1, n);
    }
}
board[X][Y] = 0;
}
int main()
{
int n;
int startX;
int startY;
int br = 0;
while (cin >> n >> startX >> startY)
{
    if (n < 4 || n > 10)
    {
        break;
    }
    int i, j;
    for (i = 0; i < n; i++)
    {
        for (j = 0; j < n; j++)
        {
            board[i][j] = 0;
        }
    }
    nextMove(startX - 1, startY - 1, 1, n);
}
return 0;
}

编辑:显然我弄错了条件。矩阵应为 2

  1. 骑士之旅是哈密顿路径问题的一个特例,一般来说是NP困难的。启发式能够在线性时间内成功定位解决方案。
  2. 对于 M × N 与 M ≤ N 一起登机,除非满足这三个条件中的一个或多个,否则封闭的骑士之旅总是可能的。
    • m 和 n 都是奇数
    • m = 1、2 或 4
    • m = 3 和 n = 4、6 或 8.wiki

您正在使用蛮力方法。因此,它陷入了找不到解决方案的情况下。

第一次输入后,程序不再让我写

因为找到解决方案后nextMove()继续执行.你应该放置标志

if (i == n * n) 
{ 
    printBoard(n); 
    global_flag=true;
    return; 
}

并选中此标志

if ((newX >= 0 && newX < n && newY >= 0 && newY < n) && (0 == board[newX]newY]))
{
    nextMove(newX, newY, i + 1, n);
    if(global_flag) return;
}

在 while 循环中初始化global_flag=false