描述
在国际象棋棋盘上放置八个皇后,要求每两个皇后之间不能直接吃掉对方。
输入
无输入。
输出
按给定顺序和格式输出所有八皇后问题的解(见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 ...以下省略
提示
此题可使用函数递归调用的方法求解。
#include<iostream>
using namespace std;
int ans = 0; // 情况的种数
int pos[8] = {}; // 每种情况中每一列上皇后在哪一行
void Put(int row, int col, int mat[8][8]) // 放一个皇后后标出所有被该皇后攻击的位置
{
int i=0,j=0;
for (i=0; i<8; i++)
{
mat[row][i] = 1;
mat[i][col] = 1;
}
i=row; j=col;
while (i>=0 && j>=0)
{
mat[i--][j--] = 1;
}
i=row; j=col;
while(i<8 && j<8)
{
mat[i++][j++] = 1;
}
i=row; j=col;
while (i>=0 && j<8)
{
mat[i--][j++] = 1;
}
i=row; j=col;
while(i<8 && j>=0)
{
mat[i++][j--] = 1;
}
}
// 按列枚举,递归
void Line(int L, int mat[8][8])
{
int i=0,j,k;;
if (L==7)
{
for (i=0; i<8; i++)
{
if (!mat[i][7])
{
pos[7] = i;
ans++;
cout << "No. " << ans << endl;
for (j=0; j<8; j++)
{
for (k=0; k<8; k++)
{
if (pos[k] == j)
{
cout << "1 ";
}
else
{
cout << "0 ";
}
}
cout << endl;
}
}
}
return;
}
for (i=0; i<8; i++)
{
if (!mat[i][L])
{
int mat1[8][8] = {}; // 新棋盘矩阵
for (j=0; j<8; j++)
{
for (k=0; k<8; k++)
{
mat1[j][k] = mat[j][k];
}
}
pos[L] = i;
Put(i,L,mat1);
Line(L+1,mat1);
}
}
}
int main() {
int mat[8][8] = {};
Line(0, mat);
return 0;
}