第三次上机作业 C:N皇后问题
总时间限制: 1000ms 内存限制: 65536kB
描述
国际象棋的棋盘是由8×8共64个方格构成,棋子放在方格里面。如果两个皇后棋子在同一行、同一列,或者在某个正方形的对角线上,那么这两个皇后就会互相攻击。请在棋盘上摆放8个皇后,使得它们都不会互相攻击。这是经典的8皇后问题。
现在要解决N皇后问题:将N个皇后摆放在一个N行N列的国际象棋棋盘上,要求任何两个皇后不能互相攻击。输入皇后数N(1<=N<=9),输出所有的摆法。无解输出"NO ANSWER"。行列号都从0开始算。
输入
一个整数N,表示要把N个皇后摆放在一个N行N列的国际象棋棋盘上。
输出
所有的摆放放案。每个方案一行,依次是第0行皇后位置、第1行皇后位置......第N-1行皇后位置。
多种方案输出顺序如下:优先输出第0行皇后列号小的方案。如果两个方案第0行皇后列号一致,那么优先输出第1行皇后列号小的方案......以此类推。
样例输入
4
样例输出
1 3 0 2
2 0 3 1
代码
#include<iostream>
#include<cmath>
using namespace std;
int N; //定义N个皇后
int queenpos[100]; //存放皇后的位置
void nqueen(int k);
int cnt = 0;
int main()
{
cin >> N;
nqueen(0); //从第0行开始摆皇后
if (!cnt)
cout <<"NO ANSWER"<<endl;
return 0;
}
void nqueen(int k)
{
int i, j;
if (k == N) //N个皇后已经摆好
{
for (i = 0; i < N; i++)
cout << queenpos[i] << " ";//输出皇后的位置
cout << endl;
cnt++;
return;
}
for (i = 0; i < N; i++) //列循环
{
for (j = 0; j < k; j++) //行循环
{
if (queenpos[j] == i || abs(queenpos[j] - i) == k - j) //判断是否和摆好的皇后冲突
{
break;
}
}
if (k == j) //当前选的位置i不冲突
{
queenpos[k] = i; //将第k个皇后摆在位置i
nqueen(k + 1); //进行递归,摆下一个皇后
}
}
}
题目来源:Guo Wei