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大小的。

输出格式:

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

输入输出样例

输入样例#1: 复制

6
输出样例#1: 复制

2 4 6 1 3 5
3 6 2 5 1 4
4 1 5 2 6 3
4

说明

题目翻译来自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;//输出可能的总数
    ;
}

最新文章

  1. PLSql Oracle配置
  2. sqlserver 游标的使用
  3. Ext-进度条
  4. 【JVM学习笔记一】JVM内存分布
  5. DS实验题 击鼓传花
  6. SPRING IN ACTION 第4版笔记-第九章Securing web applications-007-设置LDAP server比较密码(contextSource、root()、ldif()、)
  7. BootStrap最常用的几个插件(V3.3.0版)
  8. Rabbit and Grass(杭电1849)(尼姆博弈)
  9. windows下Qt Creator5.1.0编写程序以及调用OpenCV库
  10. OpenVPN多处理之-多队列TUN多线程
  11. Java学习过程中要记录的地方--汇总
  12. select下拉框使用完毕后,重置按钮使其清空
  13. nginx代理后,获取request的ip
  14. SpringMvc自动任务调度之task实现项目源码,@Scheduled
  15. 卷积(转自wiki百科)
  16. Web渗透:PHP字符编码绕过漏洞总结
  17. hbase知识
  18. Spring boot 导出Excel
  19. Android 使用正则表达式验证身份证号是否符合规则
  20. perl6: Proc::Async (new)

热门文章

  1. bootstrap框架的使用
  2. pom.xml无法引入本地的jar和安装到本地安装maven 错误: 找不到或无法加载主类 org.codehaus.plexus.classworlds.launcher.Launcher
  3. Java学习第二十五天
  4. Jquery实现自动生成二级目录
  5. SQLServer 2016 Express 安装部署,并配置支持远程连接
  6. 2017年11月3日 VS三大类&amp;数组&amp;VS的冒泡排序&amp;集合&amp;泛型集合
  7. java.util.regex.Pattern正则表达式写验证器示例
  8. java 判断图片的类型
  9. mysql四-2:多表查询
  10. Eclipse SWT