八皇后问题AC答案

#include
#include
using namespace std;
const int N = 8; //皇后的个数
int row[N];//记录n个皇后的行坐标
bool b[N]; //b[j]==0表示行j可用
bool c[N+N]; //c[j]==0表示左上-右下斜线可用, i – row[i] == j – row[j]
bool d[N+N]; //d[j]==0表示右上-左下斜线可用 i + row[i] == j + row[j]
int sum = 0;//保存可以放置的方案数
void Backtrace(int r); //递归回溯,r表示第r列
void Backtrace_2(int r);
int main()
{
Backtrace(0);
for (int i=1; i<=92; i++)
return 0;
}
void Backtrace(int r) //递归回溯,r表示第r列
{
if(r == N)
{
int map[N][N] = {0}; //存储输出表格(列序优先)
for(int i=0; i<N; i++)//因为是列序优先,控制台又只能一行行向下输出,故必须存储整个矩阵,以便输出
{
map[row[i]][i] = 1;
}
cout << “No. ” << ++sum << endl;
for(int i=0; i<N; i++)
{
for (int j=0; j<N; j++)
{
cout << map[i][j] << ” “;
}
cout << endl;
}
}
else
{
for(int j=0; j<N; j++)//可能的行号
{
if((!b[j])&& (!c[r-j+N]) && (!d[r+j])) //c[i-j+N]是为了确保下标不越界
{
row[r] = j;
b[j] = 1; //宣布占领行j
c[r-j+N] = 1; //宣布占领两条斜线
d[r+j] = 1;
Backtrace(r+1); //继续递归放置下一个皇后
//还原,以便回溯
b[j] = 0;
c[r-j+N] = 0;
d[r+j] = 0;
}
}
}
}

    原文作者:八皇后问题
    原文地址: https://blog.csdn.net/linminghui1/article/details/83051925
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞