#include<stdio.h>
#include<iostream>
using namespace std;
#define N 5
int number = 0;
int place[N] = { 0 };//place[n]表示在第n行的place[n]列放置了皇后,便于后续输出
bool flag[N]; //表示列占领,1表示可以放置(未被占领),0表示不能放置(已被占领)
bool d1[2 * N - 1];//右对角线(main函数中初始化为1)
bool d2[2 * N - 1];//左对角线(main函数中初始化为1)
void print();
void generate(int n)//最开始n=0,表示从第0行开始
{
int col;
for (col = 0; col < N; col++)//每个皇后都有N种列的选择
{
if (flag[col] && d1[n - col + N - 1] && d2[n + col])//判断是否可以放置
{
place[n] = col; //放置
flag[col] = false; //宣布占领
d1[n - col + N - 1] = false;
d2[n + col] = false;
if (n < N - 1) //未摆完
generate(n + 1);//下一行
else
{
print();
cout << "\n";
}
flag[col] = true; //回溯,跳出if语句时col会+1,完成更新
d1[n - col + N - 1] = true;
d2[n + col] = true;
}
}
}
void print()
{
int col, i, j;
number++;
cout << "No." << number << "\n";
int table[N][N] = { 0 };
for (i = 0; i < N; i++)
table[i][place[i]] = 1;
for (i = 0; i < N; i++)
{
for (j = 0; j < N; j++)
{
cout << table[i][j]<<" ";
}
cout << "\n";
}
}
int main()
{
for (int i = 0; i < N; i++)
flag[i] = 1;
for (int i = 0; i < 2 * N - 1; i++)
{
d1[i] = 1;
d2[i] = 1;
}
generate(0);
return 0;
}
递归:N皇后问题
最新推荐文章于 2024-06-12 18:28:23 发布