POJ 2198 八皇后问题(递归)
2698:八皇后问题
总时间限制:
10000ms
内存限制:
65536kB
描述
在国际象棋棋盘上放置八个皇后,要求每两个皇后之间不能直接吃掉对方。
输入
无输入。
输出
按给定顺序和格式输出所有八皇后问题的解(见Sample Output)。
样例输入
样例输出
No. 1
1 0 0 0 0 0 0 0
0 0 0 0 0 0 1 0
0 0 0 0 1 0 0 0
0 0 0 0 0 0 0 1
0 1 0 0 0 0 0 0
0 0 0 1 0 0 0 0
0 0 0 0 0 1 0 0
0 0 1 0 0 0 0 0
No. 2
1 0 0 0 0 0 0 0
0 0 0 0 0 0 1 0
0 0 0 1 0 0 0 0
0 0 0 0 0 1 0 0
0 0 0 0 0 0 0 1
0 1 0 0 0 0 0 0
0 0 0 0 1 0 0 0
0 0 1 0 0 0 0 0
No. 3
1 0 0 0 0 0 0 0
0 0 0 0 0 1 0 0
0 0 0 0 0 0 0 1
0 0 1 0 0 0 0 0
0 0 0 0 0 0 1 0
0 0 0 1 0 0 0 0
0 1 0 0 0 0 0 0
0 0 0 0 1 0 0 0
No. 4
1 0 0 0 0 0 0 0
0 0 0 0 1 0 0 0
0 0 0 0 0 0 0 1
0 0 0 0 0 1 0 0
0 0 1 0 0 0 0 0
0 0 0 0 0 0 1 0
0 1 0 0 0 0 0 0
0 0 0 1 0 0 0 0
No. 5
0 0 0 0 0 1 0 0
1 0 0 0 0 0 0 0
0 0 0 0 1 0 0 0
0 1 0 0 0 0 0 0
0 0 0 0 0 0 0 1
0 0 1 0 0 0 0 0
0 0 0 0 0 0 1 0
0 0 0 1 0 0 0 0
No. 6
0 0 0 1 0 0 0 0
1 0 0 0 0 0 0 0
0 0 0 0 1 0 0 0
0 0 0 0 0 0 0 1
0 1 0 0 0 0 0 0
0 0 0 0 0 0 1 0
0 0 1 0 0 0 0 0
0 0 0 0 0 1 0 0
No. 7
0 0 0 0 1 0 0 0
1 0 0 0 0 0 0 0
0 0 0 0 0 0 0 1
0 0 0 1 0 0 0 0
0 1 0 0 0 0 0 0
0 0 0 0 0 0 1 0
0 0 1 0 0 0 0 0
0 0 0 0 0 1 0 0
No. 8
0 0 1 0 0 0 0 0
1 0 0 0 0 0 0 0
0 0 0 0 0 0 1 0
0 0 0 0 1 0 0 0
0 0 0 0 0 0 0 1
0 1 0 0 0 0 0 0
0 0 0 1 0 0 0 0
0 0 0 0 0 1 0 0
No. 9
0 0 0 0 1 0 0 0
1 0 0 0 0 0 0 0
0 0 0 1 0 0 0 0
0 0 0 0 0 1 0 0
0 0 0 0 0 0 0 1
0 1 0 0 0 0 0 0
0 0 0 0 0 0 1 0
0 0 1 0 0 0 0 0
...以下省略
提示
此题可使用函数递归调用的方法求解。
题目链接:http://bailian.openjudge.cn/practice/2698/
解题思路:寻找n皇后问题的所有解,只能对所有的皇后串进行逐次尝试,排除不满足题目要求的情况。也就是说,从第一个皇后开始的位置开始进行尝试,如果一旦遇到一个无论如何也无法摆放的情形,那么说明之前已摆放的所有皇后位置都不可能使得该问题有解。在这种情况下,就需要对之前已摆放好的皇后位置进行调整。换句话说,n皇后问题可以用一个带回溯的递归过程系统地遍历所有的皇后串,得到全部的解。
#include<iostream>
#include<cmath>
#include<cstring>
using namespace std;
int row[8];
int queenPos[8][8];
int num = 1;
void NQueen(int k);
int main()
{
memset(queenPos, 0, sizeof(queenPos));
NQueen(0);
return 0;
}
void NQueen(int k)
{
if (k == 8)
{
for (int i = 0; i < 8; i++)
{
int j;
j = row[i];
queenPos[i][j] = 1;
}
cout << "No. " << num++ << endl;
for (int i = 0; i < 8; i++)
{
for (int j = 0; j < 8; j++)
{
cout << queenPos[j][i] << " "; //矩阵的转置
}
cout << endl;
}
memset(queenPos, 0, sizeof(queenPos));
return;
}
for (int i = 0; i < 8; ++i)
{
int j;
for (j = 0; j < k; ++j)
{
if (row[j] == i || abs(row[j] - i) == abs(k - j))
break;
}
if (j == k)
{
row[k] = i;
NQueen(k + 1);
}
}
}