Description

检查一个如下的6 x 6的跳棋棋盘,有六个棋子被放置在棋盘上,使得每行,每列,每条对角线(包括两条主对角线的所有对角线)上都至多有一个棋子。 列号

0   1   2   3   4   5   6
-------------------------
1 | | O | | | | |
-------------------------
2 | | | | O | | |
-------------------------
3 | | | | | | O |
-------------------------
4 | O | | | | | |
-------------------------
5 | | | O | | | |
-------------------------
6 | | | | | O | |
-------------------------

上面的布局可以用序列2 4 6 1 3 5来描述,第i个数字表示在第i行的相应位置有一个棋子,如下: 行号 1 2 3 4 5 6 列号 2 4 6 1 3 5 这只是跳棋放置的一个解。请遍一个程序找出所有跳棋放置的解。并把它们以上面的序列方法输出。解按字典顺序排列。请输出前3个解。最后一行是解的总个数。 特别注意: 对于更大的N(棋盘大小N x N)你的程序应当改进得更有效。不要事先计算出所有解然后只输出,这是作弊。如果你坚持作弊,那么你登陆USACO Training的帐号将被无警告删除

Input

一个数字N (6 <= N <= 13) 表示棋盘是N x N大小的。

Output

前三行为前三个解,每个解的两个数字之间用一个空格隔开。第四行只有一个数字,表示解的总数。

Sample Input

6

Sample Output

2 4 6 1 3 5
3 6 2 5 1 4
4 1 5 2 6 3
4 解题思路:求解n皇后的裸题。
之前就一直想写写关于八皇后问题的博客,这次碰到裸题,就一起说了吧。 八皇后问题: 在棋盘上放置8个皇后,使得它们互不攻击,此时每一个皇后的攻击范围为同行同列和同对角线,要求找出所有的解。 分析:最简单的思路是把问题转化为"从64个格子中选取一个子集",使得“子集中掐有8个格子,且任意两个选出的格子都不在同一行、同一列、同一个对角线上”,这正是子集的枚举问题,
然而64个格子的子集有2^64个,太大了,这并不是一个很好的模型。
第二个思路是把问题转化为“从64个格子中选8个格子”,这是组合生成问题。根据组合数学,有4.426*10^9种方案,比第一种优秀,但仍然不够很好。
经过思考,不难发现:恰好每行每列各放置一个皇后,如果用C[x]表示第x行皇后的编号,则问题变成了全排列生成问题。而0-7的排列一共有8!=40320个,枚举量不会超过它。 而至于如何枚举,则需要编写递归程序实现枚举。
当把问题分成若干步骤并递归求解时,如果当前步骤没有合法选择,则函数将返回上一级递归调用,这种现象叫做回溯。真因为这个原因,递归枚举算法常被称作回溯法。 关于代码说明。
1.既然是逐行放置,则皇后肯定不会横向攻击,因此只需要检查是否纵向和斜向攻击即可。
2.vis数组的使用:vis数组的确切意义是什么?它表示已经放置的皇后占据了那些列、主对角线、副对角线。vis[0][i]代表占据列;vis[1][x+i]代表占据副对角线;vis[2][x-i+n]代表
占据主对角线上的点,但y-x可能为负数,所以需要加n存取。 3.一般的,如果在回溯法中修改了辅助的全局变量,则一定要既是把它们恢复原状(除非故意保留所做修改!)
 #include<cstdio>
#include<cstring>
#include<algorithm>
#define MAX 110
using namespace std;
int n;
int sum;
int ans[MAX];
int vis[][MAX];///vis[0]代表列,vis[1]代表副对角线,vis[2]代表主对角线
void DFS(int x)
{
int i;
if(x==n+)
{
sum++;
if(sum<=)
{
for(i=; i<=n; i++)
{
if(i==)
{
printf("%d",ans[i]);
}
else
{
printf(" %d",ans[i]);
}
}
printf("\n");
return ;
}
}
for(i=; i<=n; i++)
{
if(!vis[][i]&&!vis[][x+i]&&!vis[][x-i+n])
{
vis[][i]=vis[][x+i]=vis[][x-i+n]=;
ans[x]=i;
DFS(x+);
vis[][i]=vis[][x+i]=vis[][x-i+n]=;///状态恢复
}
}
}
int main()
{
scanf("%d",&n);
memset(ans,,sizeof(ans));
memset(vis,,sizeof(vis));
DFS();
printf("%d\n",sum);
}
												

USACO 1.5.4 Checker Challenge跳棋的挑战(回溯法求解N皇后问题+八皇后问题说明)的更多相关文章

  1. Checker Challenge跳棋的挑战(n皇后问题)

    Description 检查一个如下的6 x 6的跳棋棋盘,有六个棋子被放置在棋盘上,使得每行,每列,每条对角线(包括两条主对角线的所有对角线)上都至多有一个棋子. 列号 0 1 2 3 4 5 6 ...

  2. USACO 6.5 Checker Challenge

    Checker Challenge Examine the 6x6 checkerboard below and note that the six checkers are arranged on ...

  3. 『嗨威说』算法设计与分析 - 回溯法思想小结(USACO-cha1-sec1.5 Checker Challenge 八皇后升级版)

    本文索引目录: 一.回溯算法的基本思想以及个人理解 二.“子集和”问题的解空间结构和约束函数 三.一道经典回溯法题点拨升华回溯法思想 四.结对编程情况 一.回溯算法的基本思想以及个人理解: 1.1 基 ...

  4. USACO1.5 Checker Challenge(类n皇后问题)

    B - B Time Limit:1000MS     Memory Limit:16000KB     64bit IO Format:%lld & %llu   Description E ...

  5. TZOJ 3522 Checker Challenge(深搜)

    描述 Examine the 6x6 checkerboard below and note that the six checkers are arranged on the board so th ...

  6. 【luoguP1219】【USACO】八皇后

    P1219 八皇后 题目描述 检查一个如下的6 x 6的跳棋棋盘,有六个棋子被放置在棋盘上,使得每行.每列有且只有一个,每条对角线(包括两条主对角线的所有平行线)上至多有一个棋子. 上面的布局可以用序 ...

  7. BZOJ2292: 【POJ Challenge 】永远挑战

    2292: [POJ Challenge ]永远挑战 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 513  Solved: 201[Submit][ ...

  8. 2292: 【POJ Challenge 】永远挑战

    2292: [POJ Challenge ]永远挑战 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 553  Solved: 230[Submit][ ...

  9. bzoj2292【POJ Challenge 】永远挑战*

    bzoj2292[POJ Challenge ]永远挑战 题意: 有向图,每条边长度为1或2,求1到n最短路.点数≤100000,边数≤1000000. 题解: 有人说spfa会T,所以我用了dijk ...

随机推荐

  1. mysql千万级数据量根据索引优化查询速度

    (一)索引的作用 索引通俗来讲就相当于书的目录,当我们根据条件查询的时候,没有索引,便需要全表扫描,数据量少还可以,一旦数据量超过百万甚至千万,一条查询sql执行往往需要几十秒甚至更多,5秒以上就已经 ...

  2. Elastix 2.4 双服务器热备搭建文档

    一.     背景知识 本文档将会用到以下两个重要的组件: a)     DRBD DRBD的全称为:Distributed Replicated Block Device,意为分布式块设备复制, D ...

  3. tp框架如何处理mysql先排序在分组

    $giModel = M('GroupIntegral'); $gi_table = $giModel->order('id desc')->limit('999')->buildS ...

  4. 创建Podfile,添加类库,中途添加库指令

    前提是你电脑已经安装了CocoaPods 1.打开终端 2.进入你的工程目录  cd /Users/...../CocoaPodsDemo  3. 创建Pods文件  touch Podfile 新建 ...

  5. chkconfig设置开机自启动的原理

    开机自启动服务的原理$ sshd on #手动设置3级别的开机自启动 [leiyf@leiyangfeng ~] #手动设置3级别的开机自启动,实质是在对应运行级别的目录rc3.d下创建一个sshd的 ...

  6. [笔记] FireDAC DataSet 导入及导出 JSON

    刚好需要将 FireDAC DataSet (TFDDataSet, TFDQuery...) 转成 JSON,网上找了一圈,原来从 XE6 开始就支持这个功能了: 储存: DataSet1.Save ...

  7. 纪中OJ 2019.02.15【NOIP提高组】模拟 B 组 梦回三国 比赛题解(第一个)

    声明 旁边的同学小 H(胡)对我说: “哟,比赛拿了 140,强!要知道,如果哥第三题 AC 了,哥就 230 了,你个废柴!!!(比赛实际分数 130 额呵)” 顿时,千万草泥马从我心中奔腾而过:你 ...

  8. 20155234 2016-2017-2第十周《Java学习笔记》学习总结

    20155234第十周<Java学习笔记>学习总结 教材学习内容总结 网络编程 在两个或两个以上的设备(例如计算机)之间传输数据.程序员所作的事情就是把数据发送到指定的位置,或者接收到指定 ...

  9. 20155329实验二 Java面向对象程序设计

    实验二 Java面向对象程序设计 1实验内容 初步掌握单元测试和TDD 理解并掌握面向对象三要素:封装.继承.多态 初步掌握UML建模 熟悉S.O.L.I.D原则 了解设计模式 2. 初步掌握单元测试 ...

  10. removeAttribute与removeAttributeNode的区别

    1.removeAttributeNode() 方法删除指定的属性,并以 Attr Node 对象返回被删除的属性. 例: <!DOCTYPE html><html><b ...