教材《c++大學教材》(第9版)
習題7.22
按照書上的思路寫的代碼,騎士走64步63步均無解,62步有5個解
不知道是不是思路的問題
代碼如下:
// KnightProblem.cpp: 定義控制臺應用程式的入口點。
//
#include "stdafx.h"
#include <iostream>
using namespace std;
int KnightTour(int a ,int b) {
int const size = 8;
int board[size][size], horizontal[8] = { 2,1,-1,-2,-2,-1,1,2 }, vertical[8] = { -1,-2,-2,-1,1,2,2,1 };
int currentRow, currentColumn;
int count=0;
currentRow = a, currentColumn = b;
int accessibility[size][size];
for (int i = 0; i < size; i++) {
for (int j = 0; j < size; j++) {
if (i == 0||i==7) {
if (j == 0 || j == 7)
accessibility[i][j] = 2;
else if (j == 1 || j == 6)
accessibility[i][j] = 3;
else
accessibility[i][j] = 4;
}
else if (i == 1 || i == 6) {
if (j == 0 || j == 7)
accessibility[i][j] = 3;
else if (j == 1 || j == 6)
accessibility[i][j] = 4;
else
accessibility[i][j] = 6;
}
else {
if (j == 0 || j == 7)
accessibility[i][j] = 4;
else if (j == 1 || j == 6)
accessibility[i][j] = 6;
else
accessibility[i][j] = 8;
}
}
}
for (int i = 0; i < size; i++) {
for (int j = 0; j < size; j++) {
board[i][j] = 0;
}
}
int willRow = 0, willColumn = 0, mark[8] = { 0,0,0,0,0,0,0,0 };
for (int i = 0; i < 8; i++) {
willRow = currentRow + horizontal[i];
willColumn = currentColumn + vertical[i];
if (willRow >= 0 && willRow < 8 && willColumn >= 0 && willColumn < 8 && board[willColumn][willRow] == 0) {
mark[i] = accessibility[willColumn][willRow];
}
if (i == 7) {
int compare = 10, num = -1;
for (int j = 0; j < 8; j++) {
if (mark[j] < compare&&mark[j] != 0) {
compare = mark[j];
num = j;
}
}
/*if (count == 60)
cout << "pause";*/
board[currentColumn][currentRow] = ++count;
currentRow += horizontal[num];
currentColumn += vertical[num];
i = -1;
if (currentColumn < 0 || currentRow < 0)
i = 8;
for (int k = 0; k < 8; k++) {
mark[k] = 0;
if (currentRow + horizontal[k] >= 0 && currentRow + horizontal[k] < 8 && currentColumn + vertical[k] >= 0 && currentColumn + vertical[k] < 8)
accessibility[currentRow + horizontal[k]][currentColumn + vertical[k]] -= 1;
}
}
}
if (count == 60) {
for (int i = 0; i < size; i++) {
for (int j = 0; j < size; j++) {
cout << board[i][j] << " ";
}
cout << endl << endl;
}
cout << count << endl << endl;
return 1;
}
return 0;
}
int main()
{
int sum = 0;
for (int i = 0; i < 8; i++)
for (int j = 0; j < 8; j++) {
sum += KnightTour(i, j);
}
cout << sum;
return 0;
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/81104.html
標籤:C++ 語言
上一篇:這是什么錯誤?
