N皇后问题
问题描述
给定一个n*n的棋盘,棋盘中有一些位置不能放皇后。现在要向棋盘中放入n个黑皇后和n个白皇后,使任意的两个黑皇后都不在同一行、同一列或同一条对角线上,任意的两个白皇后都不在同一行、同一列或同一条对角线上。问总共有多少种放法?n小于等于8。
输入格式
输入的第一行为一个整数n,表示棋盘的大小。
接下来n行,每行n个0或1的整数,如果一个整数为1,表示对应的位置可以放皇后,如果一个整数为0,表示对应的位置不可以放皇后。
输出格式
输出一个整数,表示总共有多少种放法。
这些经典的题目网上搜一下就有了
https://blog.csdn.net/qq_43235359/article/details/90605468
参考Aloof__的博客
#include <bits/stdc++.h>
using namespace std;
typedef long long int ll;
int N,cot; //分别代表棋盘尺寸(皇后数量)和皇后可能成功摆放的结果总数
int size[11];//数组的下标表示行,对应的值表示列
int ans[11]; // 用于打表存放结果
void dfs(int n)
{
int flag;
if(n==N+1) //当 最后一个皇后成功放置时返回.
{
cot++; //成功的次数加一
return ;
}
for(int i=1;i<=N;i++)
{
size[n]=i; //代表将第一个皇后放置在第1行第i列(或者说第n个皇后)
flag=1; //放完之后就行标记
for(int j=1;j<n;j++) //这个for循环用来检测 这个皇后的位置和之前的n个皇后的位置是否冲突
{
if(size[j]==i||((abs(n-j))==abs(size[j]-i)))
{
flag=0;
break;
}
}
if(flag) dfs(n+1); // 如果放置在第i列不冲突 则开始放下一个皇后 如果冲突 放在下一列继续判断
}
}
int main()
{
for( N=1;N<=11;N++)//因为本题时间限制,所以需要先打表
{
cot=0; //临时存放结果
dfs(1);
ans[N]=cot; // 将结果依次放入表中
}
while(cin >>N)
{
if(!N) break;
cout <<ans[N]<<endl;
}
return 0;
,。
}
,,,
您好,我是有问必答小助手,您的问题已经有小伙伴解答了,您看下是否解决,可以追评进行沟通哦~
如果有您比较满意的答案 / 帮您提供解决思路的答案,可以点击【采纳】按钮,给回答的小伙伴一些鼓励哦~~
ps:问答VIP仅需29元,即可享受5次/月 有问必答服务,了解详情>>>https://vip.csdn.net/askvip?utm_source=1146287632