Description

会下国际象棋的人都很清楚:皇后可以在横、竖、斜线上不限步数地吃掉其他棋子。如何将8个皇后放在棋盘上(有8 * 8个方格),使它们谁也不能被吃掉!这就是著名的八皇后问题。 
对于某个满足要求的8皇后的摆放方法,定义一个皇后串a与之对应,即a=b1b2...b8,其中bi为相应摆法中第i行皇后所处的列数。已经知道8皇后问题一共有92组解(即92个不同的皇后串)。
给出一个数b,要求输出第b个串。串的比较是这样的:皇后串x置于皇后串y之前,当且仅当将x视为整数时比y小。

Input

第1行是测试数据的组数n,后面跟着n行输入。每组测试数据占1行,包括一个正整数b(1 <= b <= 92)

Output

输出有n行,每行输出对应一个输入。输出应是一个正整数,是对应于b的皇后串。

Sample Input


Sample Output


 #include <stdio.h>
#include <string.h>
#include <iostream>
#include <string>
#include <math.h>
#include <algorithm>
#include <vector>
#include <stack>
#include <queue>
#include <set>
#include <map>
#include <sstream>
const int INF=0x3f3f3f3f;
typedef long long LL;
const int mod=1e9+;
//const double PI=acos(-1);
#define Bug cout<<"---------------------"<<endl
const int maxn=1e5+;
using namespace std; int vis[];
int A[];
int ans[][];
int cnt=; int judge(int n)
{
int flag=;
for(int i=;i<=n;i++)
{
for(int j=;j<=n;j++)
{
if(i!=j&&abs(i-j)==abs(A[i]-A[j])) //别忘了i!=j
flag=;
}
}
return flag;
} void dfs(int p,int n)
{
A[n]=p;
if(judge(n)==)
return ;
if(n==)
{
cnt++;
for(int k=;k<=;k++)
ans[cnt][k]=A[k]; //第一次写成ans[++cnt][k]=A[k]了。。。
return ;
}
for(int i=;i<=;i++)
{
if(vis[i]==)
{
vis[i]=;
dfs(i,n+);
vis[i]=;
}
}
} int main()
{
for(int i=;i<=;i++)
{
vis[i]=;
dfs(i,);
vis[i]=;
}
int T;
scanf("%d",&T);
while(T--)
{
int n;
scanf("%d",&n);
for(int i=;i<=;i++)
printf("%d",ans[n][i]);
printf("\n");
}
return ;
}

相似问题:

样例输入:


样例输出:


换了种写法,用列、主对角线和副对角线来判断

#include <stdio.h>
#include <string.h>
#include <iostream>
#include <string>
#include <math.h>
#include <algorithm>
#include <vector>
#include <stack>
#include <queue>
#include <set>
#include <map>
#include <sstream>
const int INF=0x3f3f3f3f;
typedef long long LL;
const int mod=1e9+;
const double PI = acos(-);
#define Bug cout<<"---------------------"<<endl
const int maxn=1e4+;
using namespace std; int G[][];
int jm[][];
int ans; void DFS(int num,int sum)
{
if(num>)
{
ans=max(ans,sum);
return;
}
for(int i=;i<=;i++)
{
if(jm[][i]==&&jm[][num-i+]==&&jm[][num+i]==)
{
jm[][i]=jm[][num-i+]=jm[][num+i]=;
DFS(num+,sum+G[i][num]);
jm[][i]=jm[][num-i+]=jm[][num+i]=;
}
}
} int main()
{
#ifdef DEBUG
freopen("sample.txt","r",stdin);
#endif
ios_base::sync_with_stdio(false);
cin.tie(NULL); for(int i=;i<=;i++)
{
for(int j=;j<=;j++)
{
scanf("%d",&G[i][j]);
}
}
DFS(,);
printf("%d\n",ans); return ;
}

Description

  给定一个n*n的棋盘,棋盘中有一些位置不能放皇后。现在要向棋盘中放入n个黑皇后和n个白皇后,使任意的两个黑皇后都不在同一行、同一列或同一条对角线上,任意的两个白皇后都不在同一行、同一列或同一条对角线上。问总共有多少种放法?n小于等于8。

Input

  输入的第一行为一个整数n,表示棋盘的大小。
接下来n行,每行n个0或1的整数,如果一个整数为1,表示对应的位置可以放皇后,如果一个整数为0,表示对应的位置不可以放皇后。

Output

  输出一个整数,表示总共有多少种放法。

Sample Input

4
1 1 1 1
1 1 1 1
1 1 1 1
1 1 1 1

Sample Output

2
 #include <string>
#include <math.h>
#include <algorithm>
#include <vector>
#include <stack>
#include <queue>
#include <set>
#include <map>
#include <sstream>
const int INF=0x3f3f3f3f;
typedef long long LL;
const int mod=1e9+;
//const double PI=acos(-1);
#define Bug cout<<"---------------------"<<endl
const int maxn=1e5+;
using namespace std; int G[][];
int vis[];
int tem[];
int ans[][];
int cnt; int judge(int step,int n)
{
for(int i=;i<=step;i++)
{
for(int j=;j<=step;j++)
{
if(i!=j&&abs(i-j)==abs(tem[i]-tem[j]))
return ;
}
}
return ;
} void DFS(int step,int n)
{
if(judge(step,n)==)
return ;
if(step==n)
{
cnt++;
for(int k=;k<=n;k++)
ans[cnt][k]=tem[k];
return ;
}
for(int i=;i<=n;i++)
{
if(!vis[i]&&G[step+][i])
{
vis[i]=;
tem[step+]=i;
DFS(step+,n);
vis[i]=;
}
}
} void Solve(int n)
{
int num=;
for(int i=;i<=cnt;i++)
{
for(int j=i+;j<=cnt;j++)
{
int k;
for(k=;k<=n;k++)
{
if(ans[i][k]==ans[j][k])
break;
}
if(k>n)
num++;
}
}
printf("%d\n",num*);
} int main()
{
int n;
scanf("%d",&n);
for(int i=;i<=n;i++)
for(int j=;j<=n;j++)
scanf("%d",&G[i][j]);
for(int i=;i<=n;i++)
{
if(G[][i])
{
vis[i]=;
tem[]=i;
DFS(,n);
vis[i]=;
}
}
Solve(n);
return ;
}

八皇后问题 2n皇后问题的更多相关文章

  1. 对八皇后的补充以及自己解决2n皇后问题代码

    有了上次的八皇后的基础.这次准备解决2n皇后的问题,: //问题描述// 给定一个n*n的棋盘,棋盘中有一些位置不能放皇后.现在要向棋盘中放入n个黑皇后和n个白皇后,使任意的两个黑皇后都不在同一行./ ...

  2. 计蒜课--2n皇后、n皇后的解法(一般操作hhh)

    给定一个 n*nn∗n 的棋盘,棋盘中有一些位置不能放皇后.现在要向棋盘中放入 nn 个黑皇后和 nn个白皇后,使任意的两个黑皇后都不在同一行.同一列或同一条斜线(包括正负斜线)上,任意的两个白皇后都 ...

  3. n皇后问题与2n皇后问题

    n皇后问题 问题描述: 如何能够在 n×n 的棋盘上放置n个皇后,使得任何一个皇后都无法直接吃掉其他的皇后 (任两个皇后都不能处于同一条横行.纵行或斜线上) 结题思路: 可采用深度优先算法,将棋盘看成 ...

  4. 蓝桥杯 基础训练 2n皇后

    数月前做的2N皇后基本看书敲代码的,然后发现当时的代码不对,正好做到算法提高的8皇后·改,顺便把以前的代码顺带改了下,题目如下: 问题描述 给定一个n*n的棋盘,棋盘中有一些位置不能放皇后.现在要向棋 ...

  5. C语言 · 2n皇后问题

    基础练习 2n皇后问题   时间限制:1.0s   内存限制:512.0MB        锦囊1 搜索算法. 锦囊2 先搜索n皇后的解,在拼凑成2n皇后的解. 问题描述 给定一个n*n的棋盘,棋盘中 ...

  6. 蓝桥杯 基础训练 BASIC-27 2n皇后问题

    基础练习 2n皇后问题   时间限制:1.0s   内存限制:512.0MB 问题描述 给定一个n*n的棋盘,棋盘中有一些位置不能放皇后.现在要向棋盘中放入n个黑皇后和n个白皇后,使任意的两个黑皇后都 ...

  7. 蓝桥--2n皇后问题(递归)--搬运+整理+注释

    N皇后问题: #include <iostream> #include <cmath> using namespace std; int N; ];//用来存放算好的皇后位置. ...

  8. 基础训练 2n皇后问题

    2n皇后问题 #include<iostream> #include<vector> using namespace std; int cnt = 0, n; vector&l ...

  9. 2n皇后 - 回溯

    题目地址:http://www.51cpc.com/web/problem.php?id=1172 Summarize: 1. 递归回溯: 2. 先扫完一种皇后,再扫描另一种: 3. 循环输入: 4. ...

随机推荐

  1. P1036 跟奥巴马一起编程

    转跳点:

  2. P1031 查验身份证

    转跳点:

  3. springboot + shiro+登录 微信登录 次数验证资料

    分享一个朋友的人工智能教程.零基础!通俗易懂!风趣幽默!大家可以看看是否对自己有帮助,点击查看教程. 1.https://blog.csdn.net/xtiawxf/article/details/5 ...

  4. Codeforces 437D 贪心+并查集

    这个题目让我想起了上次在湘潭赛的那道跪死了的题.也是最值问题,这个也是,有n个动物园 每个都有权值 然后被m条路径相连接,保证图是连通的,然后求所有的p[i][j]之和.i,j为任意两个zoo,pij ...

  5. 前端框架vue学习笔记

    占坑

  6. HDU 5311:Hidden String

    Hidden String  Accepts: 437  Submissions: 2174  Time Limit: 2000/1000 MS (Java/Others)  Memory Limit ...

  7. LVS DR模式搭建、keepalived+LVS搭建介绍

    参考文献 http://blog.51cto.com/taoxie/2066993 疑问: 1.为什么要修改RealServer的返回arp响应和发送arp请求参数  echo "1&quo ...

  8. C++逐词读取txt

    这一篇来写下std::ifstream读取txt的另一种方式,逐词读取,上一篇是按行读取,逐词读取的话每个单词都以空格或者换行等符号间隔开. 代码如下: #include "stdafx.h ...

  9. 磁盘报No space left on device,但是 df -h 查看磁盘空间没满

    df -h Filesystem Size Used Avail Use% Mounted on /dev/mapper/dev01-root 75G 58G 14G 82% / udev 2.0G ...

  10. UML-快速的更新分析

    1.目标 本章主要介绍需求和领域分析中的一些变更. 迭代1阶段:结束时,举行为期1-2天的简短的需求讨论会,内容是调查和详细编写更多需求+解决初始阶段反馈问题. 迭代2阶段:结束时,举行为期1-2天的 ...