Time Limit: 10 second

Memory Limit: 2 MB

在n*n的棋盘上放置n个皇后(国际象棋中的皇后,n≤10)而彼此不受攻击(即在棋盘的任一行,任一列和任一对角线上不能放置两个皇后),编程求出所有的摆放方法

Input

输入文件仅一行,输入n(0≤n≤10)。

Output

每行输出一种方案,每种方案按顺序输出皇后所在的列号,各个数之间用空格隔开,若无方案,则输出“No solution!”。(最后用换行结束)

Sample Input

4

Sample Output

2 4 1 3
3 1 4 2

【题解】

这题的主要问题在于,要如何判断当前搜素到的位置能不能放下棋子。

这里用了3个数组来解决问题。

zxbo,fxbo,bo;

zxbo数组和fxbo数组代表①类。

bo数组代表②类。

用b[i][j],a[i][j]两个二维数组存储每个位置所代表的类。

其中b[i][j] = i - j;a[i][j] = i + j;

如n = 5 得到的b数组和a数组如下。

可以看到b数组从左上到右下的对角线,数字是一样的。

而a数组 从右上到左下的对角线,数字也是一样的。

我们用fxbo,zxbo分别表示负数和正数的b数组中的数字是否出现过。

用bo数组表示a数组中的数字是否出现过。(a数组不会出现负数)

然后每次放棋子的时候我们只要看看a[i][j]和b[i][j]的值 m,n。然后看看bo[m] 和 fxbo[n]或zxbo[n] 是否为false,如果为false则表示可以放,否则不能放。

放完后把上面的bo,fxbo或 zxbo数组置为true;

一行一行的搜索就好,同时还应该加入一个lbo数组,用来判断列的重复情况。

【代码】

#include <cstdio>
int a[12][12],b[12][12],n,ans[20],nn = 0; //ans 数组用于记录答案,nn整形用于判断答案数,以此来判断是否输出无解信息。
bool zxbo[25],fxbo[25],lbo[12],bo[25];
void init()
{
scanf("%d",&n);
for (int i = 1;i <= n;i++)
for (int j = 1; j <= n;j++)
a[i][j] = i + j,b[i][j] = i - j; //初始化a,b数组
for (int i = 1;i <= n;i++) //初始化各个判重数组
lbo[i] = false;
for (int i = 0;i <= 22;i++)
zxbo[i] = false,fxbo[i] = false,bo[i] = false;
}
void output_ans() //放完所有的棋子,然后输出答案。
{
for (int j = 1;j <= n-1;j++)
printf("%d ",ans[j]);
printf("%d\n",ans[n]);
}
void sear_ch(int x ) //搜索第x行
{
if (x == n+1) //如果已经搜完了,就输出答案。
{
output_ans();
nn++;
return;
}
for (int i = 1; i <= n;i++) //尝试每一列
{
if (lbo[i]) continue; //如果已经搜索过这一列,就搜下一列。
int tt = a[x][i],t = b[x][i]; //获取这个位置的“两个类的值”
bool flag = true; //用来判断两个对角线是否都符合要求。
flag = bo[tt];
if (flag) continue;
if ( t > 0)
flag = zxbo[t];
else
flag = fxbo[-t];
if (flag) continue;
bo[tt] = true; //tt = i + j 是一定大于0的
if (t > 0) //而t = i - j 是可能小于0 的
zxbo[t] = true;
else
fxbo[-t] = true;
lbo[i] = true; //标记这一列被占领
ans[x] = i; //记录答案
sear_ch(x+1); //寻找下一行.
lbo[i] = false;
bo[tt] = false;
if (t > 0)
zxbo[t] = false;
else
fxbo[-t] = false;
}
}
void s_p()
{
if (nn == 0)
printf("No solution!\n");
}
int main()
{
init();
sear_ch(1);
s_p();
return 0;
}

【5001】n皇后问题的更多相关文章

  1. 递归实现n(经典的8皇后问题)皇后的问题

    问题描述:八皇后问题是一个以国际象棋为背景的问题:如何能够在8×8的国际象棋棋盘上放置八个皇后, 使得任何一个皇后都无法直接吃掉其他的皇后?为了达到此目的,任两个皇后都不能处于同一条横行.纵行或斜线上 ...

  2. 八皇后算法的另一种实现(c#版本)

    八皇后: 八皇后问题,是一个古老而著名的问题,是回溯算法的典型案例.该问题是国际西洋棋棋手马克斯·贝瑟尔于1848年提出:在8×8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于 ...

  3. [LeetCode] N-Queens II N皇后问题之二

    Follow up for N-Queens problem. Now, instead outputting board configurations, return the total numbe ...

  4. [LeetCode] N-Queens N皇后问题

    The n-queens puzzle is the problem of placing n queens on an n×n chessboard such that no two queens ...

  5. N皇后问题—初级回溯

    N皇后问题,最基础的回溯问题之一,题意简单N*N的正方形格子上放置N个皇后,任意两个皇后不能出现在同一条直线或者斜线上,求不同N对应的解. 提要:N>13时,数量庞大,初级回溯只能保证在N< ...

  6. 数据结构0103汉诺塔&八皇后

    主要是从汉诺塔及八皇后问题体会递归算法. 汉诺塔: #include <stdio.h> void move(int n, char x,char y, char z){ if(1==n) ...

  7. N皇后问题

    题目描述 在n×n格的棋盘上放置彼此不受攻击的n个皇后.按照国际象棋的规则,皇后可以攻击与之处在同一行或同一列或同一斜线上的棋子.n后问题等价于再n×n的棋盘上放置n个后,任何2个皇后不妨在同一行或同 ...

  8. LeetCode:N-Queens I II(n皇后问题)

    N-Queens The n-queens puzzle is the problem of placing n queens on an n×n chessboard such that no tw ...

  9. 八皇后问题_Qt_界面程序实现

    //核心代码如下 //Queen--放置皇后 #include "queue.h" queue::queue() { *; ; this->board = new bool[ ...

随机推荐

  1. 使用spring-boot 国际化配置所碰到的乱码问题

    写好html静态页面 ,  也加上了编码格式 , 获取国际化展示在浏览器中还是存在乱码 , 开始以为是浏览器编码格式问题 , 做过处理后任没有得到解决 , 具体的处理方案如下: <meta ht ...

  2. 【Codeforces Round #457 (Div. 2) A】 Jamie and Alarm Snooze

    [链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 暴力往前走x分钟就好. 直到出现7为止. [代码] #include <bits/stdc++.h> using nam ...

  3. FZU 1921 栀子花开

    栀子花开 Time Limit: 1000ms Memory Limit: 32768KB This problem will be judged on FZU. Original ID: 19216 ...

  4. Mblog 部署手册

    准备工作 安装 JDK8 安装图片处理工具:GraphicsMagick1.3.20,下载地址 安装 Maven 准备 IDE (如果你不看源码,可以忽略下面的步骤,直接通过Maven编译war包) ...

  5. [Angular & Unit Testing] Testing a RouterOutlet component

    The way to test router componet needs a little bit setup, first we need to create a "router-stu ...

  6. android 自己定义控件属性(TypedArray以及attrs解释)

    近期在捣鼓android 自己定义控件属性,学到了TypedArray以及attrs.在这当中看了一篇大神博客Android 深入理解Android中的自己定义属性.我就更加深入学习力一番.我就沿着这 ...

  7. ELKstack 中文指南

    https://www.elastic.co/downloads ELKstack 中文指南 .net Elasticsearch 学习入门笔记   一. es安装相关1.elasticsearch安 ...

  8. Onvif开发之Linux下gsoap的使用及移植

    一直以来都是在CSDN上面学习别人的东西,很多次想写点什么但是又无从写起.由于公司项目需要,最近一段时间在研究onvif,在网上找了很多资料,发现资料是非常多,但是很少有比较全的资料,或者资料太多无从 ...

  9. 囧 appspot.com/

    囧 appspot.com/ 我负责公司人事,最近车间招了一批外来打工妹,让她们填写个人资料表格,早上在看表格登记,发现其中一张政治面貌一栏赫然写着"瓜子脸",当时笑得眼泪直流,没 ...

  10. Android时间戳与字符串相互转换

    import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Date; public cl ...