Problem Description
求出在一个n×n的棋盘上,放置n个不能互相捕捉的国际象棋“皇后”的所有布局。这是来源于国际象棋的一个问题。皇后可以沿着纵横和两条斜线4个方向相互捕捉。如图所示,一个皇后放在棋盘的第4行第3列位置上,则棋盘上凡打“×”的位置上的皇后就能与这个皇后相互捕捉,也就是下一个皇后不能放的位置。
Input
在程序运行时输入n值的大小,用来确定棋盘的规模,即棋盘共有n×n个方格可以摆放皇后.
Output
应输出n个皇后不能互相攻击的所有布局,其中皇后的摆放位置应该满足题目中给出的规定条件。
Sample Input
Enter n : 8
即规定问题为8皇后问题
Sample Output
列 行
解题思路:
1. 首先分析题目的意思,每个皇后不能在同一行,同一列,同一对角线存在,这样子的话,就是用(x1, y1),(x2, y2)来表示两个点,这样子就转化成数学问题,只要 保证x1!=x2 && (x1-x2)!= (y1 - y2)即可。
2. 后面代码编写就很简单了!
#include "iostream"
#include "conio.h"
using namespace std;
#define N 100
int iResult[N];
bool Place(int k)
{
for (int i = 1; i < k; ++i)
{
if (iResult[k] == iResult[i] || abs(k - i) == abs(iResult[k] - iResult[i]))
{
return false;
}
}
return true;
}
void Queue(int n)
{
for (int i = 1; i < n + 1; ++i)
{
iResult[i] = 0;
}
int k = 1;
while (k >= 1)
{
iResult[k] = iResult[k] + 1;
while ((iResult[k] <= n) && (!Place(k)))
{
iResult[k] = iResult[k] + 1;
}
if ((iResult[k] <= n )&& (k == n))
{
for (int i = 1; i <= n; ++i)
{
cout << i << "\t" << iResult[i] << endl;
}
//return;
cout << "Enter a character(Q/q for exit)!" << endl;
char c = getch();
if (tolower(c) == 'q')
{
return;
}
if (iResult[1] == 9)
{
return;
}
}
else if ((iResult[k] <= n) && (k < n))
{
k = k + 1;
}else
{
iResult[k] = 0;
k = k - 1;
}
}
}
int main()
{
int n;
cout << "Enter n:";
cin >> n;
Queue(n);
return 1;
}