问题 U: 【回溯】n皇后问题

时间限制: 1 Sec  内存限制: 128 MB
提交: 4  解决: 4
[提交][状态][讨论版]

题目描述

在一个国际象棋棋盘上,放置n个皇后(n<10),使她们相互之间不能进攻。求出所有布局。

输入

一个整数n(0<n<10)

输出

每行输出一种方案,每种方案顺序输出皇后所在的列号,各个数之间用空格分隔。

样例输入

4

样例输出

    2    4    1    3
3 1 4 2 解题思路:一上午都没做出题来,开始看回溯了,总是不能理解,今下午看刘汝佳的算法竞赛,上面有n皇后问题,讲解地很细致。
  看完后然后终于能敲出代码了。
  c[i]保存第i行的列,比如 3 2 4 0 5 ,3表示第零行放在第三列,2表示第一行放在第2列,4表示第二行放在第4列,0表示第三行放在第0列...(从0开始)
  函数backtrack(int line)需要设置结束条件,当行数==n时,就可以输出c[i]保存的结果了。
  
  当没到结束条件时,就开始从i到n遍历一遍,i到n指每一列,然后用函数 condition(line,i) 判断第line行,i列是否可以放皇后。
  在 condition(line,i) 里面有个v[3][2n]数组, v[0][],v[1][],v[2],分别表示第i列,副对角线,主对角线是否已经有皇后放置。
  

  line+i和line-i只要有一个是1,就说明这个位置的主对角线,或副对角线上已经有皇后了,便不能再放了,但由于line-i可能为负数,便用+n来保存。

  另外要注意backtrack(line+1)之后吧这三个数组的值还原成0;

代码:
#include <iostream>
#include <cstdio> using namespace std; int n;
int c[]={};
int v[][]={}; bool condition(int line,int i){
return !v[][i] && !v[][line+i] && !v[][line-i+n];
} void backtrack(int line){
if(line==n){
for(int i=;i<n;i++){
printf(" %d",c[i]+);
}
printf("\n");
}else{
for(int i=;i<n;i++){ //分别试试放哪一列上
if(condition(line,i)){
c[line]=i;
v[][i]=v[][line+i]=v[][line-i+n]=;
backtrack(line+);
v[][i]=v[][line+i]=v[][line-i+n]=;
}
}
}
} int main()
{ scanf("%d",&n);
backtrack();
return ;
}
 

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

  1. [HDU 2553]--N皇后问题(回溯)/N皇后问题的分析

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2553 N皇后问题 Time Limit: 2000/1000 MS (Java/Others)     ...

  2. hdu1116回溯N皇后问题

    题目连接 经过思考,不难发现:恰好N个皇后放在不同行不同列,那么是不是可以转换成N个皇后所在行分别确定(一人一行)的情况下对她们的所在列的枚举. 也就是列的全排列生成问题,我们用c[x]表示x行皇后的 ...

  3. 回溯---N皇后

    N 皇后 51. N-Queens (Hard) 题目描述:   在n*n的矩阵中摆放n个皇后,并且每个皇后不能在同一列,同一个对角线上,求所有的n皇后解. 思路分析:   一行一行地摆放,在确定一行 ...

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

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

  5. ACM_N皇后问题

    N皇后问题 Time Limit: 2000/1000ms (Java/Others) Problem Description: 在N*N的方格棋盘放置了N个皇后,使得它们不相互攻击(即任意2个皇后不 ...

  6. 八皇后问题——列出所有的解,可推至N皇后

    <数据结构>--邓俊辉版本 读书笔记 今天学习了回溯法,有两道习题,一道N皇后,一道迷宫寻径.今天,先解决N皇后问题.由于笔者 擅长java,所以用java重现了八皇后问题. 注意是jav ...

  7. NOIP算法总结

    前言 离NOIP还有一个星期,匆忙的把寒假整理的算法补充完善,看着当时的整理觉得那时还年少.第二页贴了几张从贴吧里找来的图片,看着就很热血的.旁边的同学都劝我不要再放PASCAL啊什么的了,毕竟我们的 ...

  8. 冲刺NOIP复习,算法知识点总结

    前言        离NOIP还有一个星期,匆忙的把整理的算法补充完善,看着当时的整理觉得那时还年少.第二页贴了几张从贴吧里找来的图片,看着就很热血的.当年来学这个竞赛就是为了兴趣,感受计算机之美的. ...

  9. 经典算法问题的java实现 (二)

    原文地址: http://liuqing-2010-07.iteye.com/blog/1403190   1.数值转换(System Conversion) 1.1 r进制数   数N的r进制可以表 ...

  10. Android中的算法

    算法是思想的体现形式,常见的算法做一些总结 算法简介 算法-Algorithm 解题方案的准确而完整的描述,是一系列解决问题的清晰指令 特征 有穷性,确切性,输入项,输出项,可行性 算法运算要素 算术 ...

随机推荐

  1. 使用Navicat远程管理OpenShift的数据库

    其实 phpMyAdmin 这个 web 端的 MySQL 数据库管理工具还是很好的,要不然也不会成为 MySQL 数据库的绝配.但是我想,很多人应该和重华一样,不太喜欢使用 web 端的工具,总觉得 ...

  2. 【POJ 1094】拓扑排序

    题意 给出n,代表有以A开始的n个字母,给出它们的m个小于关系(A<B).如果前i个关系可以确定n个字母的一个顺序就输出: Sorted sequence determined after i ...

  3. [IOS+PHP Jason格式的发送与解析]

    服务器端PHP文件connect.php: <?php $q = mysql_connect("localhost","root","" ...

  4. JavaWeb:报错信息The superclass "javax.servlet.http.HttpServlet" was not found on the Java Build Path

    建立了一个Javaweb工程,并在eclipse中配置了Web容器Tomcat.新建的jsp页面,添加一个简单的Java类.可是,JSP页面顶端出现“红色”的报错信息:The superclass & ...

  5. C#获取局域网中的所有正在使用的IP地址

    方法不是很好. using System; using System.Collections.Generic; using System.Linq; using System.Text; using ...

  6. 找出进程中各线程cpu消耗情况

    以root用户执行以下命令,以PID 5423举例: 1,根据top命令,找到占用CPU高的进程,找到PID  PID USER      PR  NI  VIRT  RES  SHR S %CPU ...

  7. The file couldn’t be opened because you don’t have permission to view it

    because you dont have permission to view it 解决办法 Project---Build Setting中 修改这一项,变成Default Compiler(A ...

  8. Linux下web目录权限设置

    1.nginx和php-fpm运行用户为www 2.我们假设web目录所属着为web_owner 3.将web目录的用户和用户组设置为web_owner和www,如下命令:chown -R web_o ...

  9. 如何建立批处理文件(.bat或.cmd)

    如何建立批处理文件(.bat或.cmd) 建立批处理文件 批处理文件就是把多个dos命令放在一起. 批处理文件是无格式的文本文件,它包含一条或多条命令.它的文件扩展名为 .bat 或 .cmd.在命令 ...

  10. BlockingQueue详解

    本例介绍一个特殊的队列:BlockingQueue,如果BlockingQueue是空的,从BlockingQueue取东西的操作将会被阻断进入 等待状态,直到BlockingQueue进了东西才会被 ...