【luoguP1219】【USACO】八皇后
P1219 八皇后
题目描述
检查一个如下的6 x 6的跳棋棋盘,有六个棋子被放置在棋盘上,使得每行、每列有且只有一个,每条对角线(包括两条主对角线的所有平行线)上至多有一个棋子。
上面的布局可以用序列2 4 6 1 3 5来描述,第i个数字表示在第i行的相应位置有一个棋子,如下:
行号 1 2 3 4 5 6
列号 2 4 6 1 3 5
这只是跳棋放置的一个解。请编一个程序找出所有跳棋放置的解。并把它们以上面的序列方法输出。解按字典顺序排列。请输出前3个解。最后一行是解的总个数。
//以下的话来自usaco官方,不代表洛谷观点
特别注意: 对于更大的N(棋盘大小N x N)你的程序应当改进得更有效。不要事先计算出所有解然后只输出(或是找到一个关于它的公式),这是作弊。如果你坚持作弊,那么你登陆USACO Training的帐号删除并且不能参加USACO的任何竞赛。我警告过你了!
输入输出格式
输入格式:
一个数字N (6 <= N <= 13) 表示棋盘是N x N大小的。
输出格式:
前三行为前三个解,每个解的两个数字之间用一个空格隔开。第四行只有一个数字,表示解的总数。
输入输出样例
说明
题目翻译来自NOCOW。
USACO Training Section 1.5
很经典的一道深搜题,但题目略作改动,不是八皇后,而是N皇后了,题目要求输入的就是N。
既然题目限定了皇后不能在同一行,那么也就确定了一行只能有一个皇后,减少了一重循环。
我们定义一个a[MAXN],一个b[MAXN],一个c[MAXN],一个d[MAXN],总共四个数组,
a表示的是行,b表示的是列,c表示的是从左下到右上的对角线,d表示从左上到右下的对角线。
我们首先定义一个递归函数,叫search,在其中定义一个不断++的i,表示防止道德皇后序号,当i>n,也就是每一行都满了的时候,
就执行输出,并return 的操作。
如果else的话,我们就再次定义一个j,表示这一行的每一个格,也就是在不断尝试i可能在的位置。
这是下面就会有几个操作:
1.a[i]=j 这个就是放置皇后i到第j个点,不用多说了。
2.b[j]=1 好了现在这一步就是说明皇后i占了整个第j列,那么其他的皇后就都不能在bool为1的这个纵列放置了。
3.c[i+j]=1 宣布占领第一条对角线。那么其他皇后就又少了一些可以放置的地方了。
4.d[i-j+n-1] 宣布占领最后一条对角线。至于为什么着两条对角线的下标,大家可以自己造一个表想一想。
然后便是search(i+1)继续进行搜索下一个皇后的位置。
当然在这之后不要忘了
b[j]=0,c[i+j]=0,d[i-j+n-1]=0,这是为了回溯,清除标记,而由于一行只能放一个皇后,所以a[i]就没有必要消除了。
然后就是输出了,由于题目要求输出的时候只输出三种情况,那么我们干脆就直接输出前三个吧。
只需要定义一个sum,然后在print()函数中不断++,cout就可以了。
然后最后要做的就是在main函数里面输出sum。
下面附上代码::
#include<iostream>//个人不建议采用头文件,可能和定义的变量或名字起冲突,从而引起编译错误; #include<cstdlib> #include<cstdio> #include<cmath> using namespace std; ],b[],c[],d[]; //a数组表示的是行; //b数组表示的是列; //c表示的是左下到右上的对角线; //d表示的是左上到右下的对角线; int total;//总数:记录解的总数 int n;//输入的数,即N*N的格子,全局变量,搜索中要用 int print() { )//保证只输出前三个解,如果解超出三个就不再输出,但后面的total还需要继续叠加 { ;k<=n;k++) cout<<a[k]<<" ";//for语句输出 cout<<endl; } total++;//total既是总数,也是前三个排列的判断 } void queen(int i)//搜索与回溯主体 { if(i>n) { print();//输出函数,自己写的 return; } else { ;j<=n;j++)//尝试可能的位置 { if((!b[j])&&(!c[i+j])&&(!d[i-j+n]))//如果没有皇后占领,执行以下程序 { a[i]=j;//标记i排是第j个 b[j]=;//宣布占领纵列 c[i+j]=; d[i-j+n]=; //宣布占领两条对角线 queen(i+);//进一步搜索,下一个皇后 b[j]=; c[i+j]=; d[i-j+n]=; //(回到上一步)清除标记 } } } } int main() { cin>>n;//输入N*N网格,n已在全局中定义 queen();//第一个皇后 cout<<total;//输出可能的总数 ; }
【luoguP1219】【USACO】八皇后的更多相关文章
- USACO八皇后
VIS 0 1 2分别竖线和两个对角线,参见对角线(x,y)的和 差关系表 #include<iostream> #include<cstdio> #include<al ...
- USACO 1.5.4 Checker Challenge跳棋的挑战(回溯法求解N皇后问题+八皇后问题说明)
Description 检查一个如下的6 x 6的跳棋棋盘,有六个棋子被放置在棋盘上,使得每行,每列,每条对角线(包括两条主对角线的所有对角线)上都至多有一个棋子. 列号 0 1 2 3 4 5 6 ...
- 洛谷 P1219 八皇后【经典DFS,温习搜索】
P1219 八皇后 题目描述 检查一个如下的6 x 6的跳棋棋盘,有六个棋子被放置在棋盘上,使得每行.每列有且只有一个,每条对角线(包括两条主对角线的所有平行线)上至多有一个棋子. 上面的布局可以用序 ...
- P1219 八皇后
题目描述 检查一个如下的6 x 6的跳棋棋盘,有六个棋子被放置在棋盘上,使得每行.每列有且只有一个,每条对角线(包括两条主对角线的所有平行线)上至多有一个棋子. 上面的布局可以用序列2 4 6 1 3 ...
- P1219 八皇后 含优化 1/5
题目描述 检查一个如下的6 x 6的跳棋棋盘,有六个棋子被放置在棋盘上,使得每行.每列有且只有一个,每条对角线(包括两条主对角线的所有平行线)上至多有一个棋子. 上面的布局可以用序列2 4 6 1 3 ...
- 『嗨威说』算法设计与分析 - 回溯法思想小结(USACO-cha1-sec1.5 Checker Challenge 八皇后升级版)
本文索引目录: 一.回溯算法的基本思想以及个人理解 二.“子集和”问题的解空间结构和约束函数 三.一道经典回溯法题点拨升华回溯法思想 四.结对编程情况 一.回溯算法的基本思想以及个人理解: 1.1 基 ...
- 八皇后算法的另一种实现(c#版本)
八皇后: 八皇后问题,是一个古老而著名的问题,是回溯算法的典型案例.该问题是国际西洋棋棋手马克斯·贝瑟尔于1848年提出:在8×8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于 ...
- 数据结构0103汉诺塔&八皇后
主要是从汉诺塔及八皇后问题体会递归算法. 汉诺塔: #include <stdio.h> void move(int n, char x,char y, char z){ if(1==n) ...
- Python学习二(生成器和八皇后算法)
看书看到迭代器和生成器了,一般的使用是没什么问题的,不过很多时候并不能用的很习惯 书中例举了经典的八皇后问题,作为一个程序员怎么能够放过做题的机会呢,于是乎先自己来一遍,于是有了下面这个ugly的代码 ...
随机推荐
- cloudera manager的7180 web界面访问不了的解决办法(图文详解)
说在前面的话 我的机器是总共4台,分别为ubuntucmbigdata1.ubuntucmbigdata2.ubuntucmbigdata3和ubuntucmbigdata4.(注意啦,以下是针对Ub ...
- mongodb随机查询一条记录的正确方法!
关于从mongodb库中随机取出一条记录的方法的博文很多,其中都提到了下面三种方法: 1.skip过随机数量的记录. DBCursor cursor = coll.find(query); int r ...
- JS字符串与二进制的相互转化
//字符串转ascii码,用charCodeAt(); //ascii码转字符串,用fromCharCode(); var str = "A"; var code = str.ch ...
- mongoDB cpu飙高问题
问题描述: 最近几天生产环境上的mongodb一直在报警,cpu飙高,其他如内存.iops.连接数.磁盘操作等都正常.通过定位业务,发现是由于mongodb的表其中一个查询未建立索引导致,110多W的 ...
- 白话SpringCloud | 第六章:Hystrix监控面板及数据聚合(Turbine)
前言 前面一章,我们讲解了如何整合Hystrix.而在实际情况下,使用了Hystrix的同时,还会对其进行实时的数据监控,反馈各类指标数据.今天我们就将讲解下Hystrix Dashboard和Tur ...
- java ReentrantLock Condition
sychronized.wait.notify.notifyAll.sleep 在多线程环境下,为了防止多个线程同时调用同一个方法.修改同一份变量,造成数据读取结果混乱,可以使用synchronize ...
- shell命令修改文件内容
有个 test.txt 文件内容为 hello tom,现在修改成 hello jerry,并保存到test2.txt sed 's/tom/jerry/g' test.txt >test2. ...
- JavaScirpt(JS)——BOM浏览器对象模型
一.BOM概念 BOM(Browser Object Model)即浏览器对象模型.可以对浏览器窗口进行访问和操作.使用 BOM,开发者可以移动窗口.改变状态栏中的文本以及执行其他与页面内容不直接相关 ...
- CSS文字有关属性
font-size|family|weight|style 大小字体加粗斜体 color|opacity 颜色透明度 height+line-height:垂直居中 overflow:hidden|v ...
- H5新特性监听手机的返回键
var hiddenProperty ='hidden' in document ? 'hidden' :'webkitHidden' in document ? 'webkitHidden' : ' ...