骑士在C++的巡回演出
Knight's tour in C++
我有这个骑士之旅的问题,我必须解决。我必须输入一个 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
- 骑士之旅是哈密顿路径问题的一个特例,一般来说是NP困难的。启发式能够在线性时间内成功定位解决方案。
- 对于 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
相关文章: