题目描述

相信大家都听过经典的“八皇后”问题吧?这个游戏要求在一个8×8的棋盘上放置8个皇后,使8个皇后互相不攻击(攻击的含义是有两个皇后在同一行或同一列或同一对角线上)。

桐桐对这个游戏很感兴趣,也很快解决了这个问题。可是,他想为自己增加一点难度,于是他想求出n皇后的解的情况。

你能帮助她吗?

输入输出格式

输入格式:

一行,仅有一个数n(1≤n≤14),表示为n皇后问题。

输出格式:

输出仅有一个数,表示n皇后时问题的解法总数。

输入输出样例

输入样例:

8
输出样例:

92
思路:
从第一行开始放置每一个皇后,并标记所在的列和对角线。

初始代码:
//程序名:新的C++程序
//作者: #include<iostream>
#include<fstream>
#include<algorithm> using namespace std;
int n,b[],c[],d[],t;
void ch(int j,int i,int s)
{
b[i]=j;
c[i+s]=j;
d[i-s+n-]=j;
}
void dfs(int s)
{
if(s==n+){t++;return;}
for(int i=;i<=n;i++)
{
if(!b[i]&&!c[i+s]&&!d[i-s+n-])
{
ch(,i,s);
dfs(s+);
ch(,i,s);
}
}
}
int main()
{
cin>>n;
dfs();
cout<<t; return ;
}

代码


发现当n=14时,用时超过1秒。
可以利用放置方法的对称性解决问题。
解决方案: 1.当n为偶数时,第一个皇后只放在左侧,最后再把结果乘2.
//程序名:新的C++程序
//作者: #include<iostream>
#include<fstream>
#include<algorithm>
#include<ctime> using namespace std;
int n,a[],b[],c[],d[],t,m;
void dfs(int s)
{
if(s==n+){t++;return;}
if(n%==)
if(s==)
for(int i=;i<=m;i++)
{
if(!b[i]&&!c[i+s]&&!d[i-s+n-])
{
a[s]=i;
b[i]=;
c[i+s]=;
d[i-s+n-]=;
dfs(s+);
b[i]=;
c[i+s]=;
d[i-s+n-]=;
}
}
else
for(int i=;i<=n;i++)
{
if(!b[i]&&!c[i+s]&&!d[i-s+n-])
{
a[s]=i;
b[i]=;
c[i+s]=;
d[i-s+n-]=;
dfs(s+);
b[i]=;
c[i+s]=;
d[i-s+n-]=;
}
}
else
for(int i=;i<=n;i++)
{
if(!b[i]&&!c[i+s]&&!d[i-s+n-])
{
a[s]=i;
b[i]=;
c[i+s]=;
d[i-s+n-]=;
dfs(s+);
b[i]=;
c[i+s]=;
d[i-s+n-]=;
}
}
}
int main()
{
cin>>n;
m=n/;
dfs();
if(n%==)cout<<t;
else cout<<t*; return ;
}

代码

2.当n为偶数时,第一个皇后只放在左侧,反之第一个皇后放在左侧及中线,第二个放在其左边。最后再把结果乘2.
 //程序名:新的C++程序
//作者: #include<iostream>
#include<fstream>
#include<algorithm>
#include<ctime> using namespace std;
int n,a[],b[],c[],d[],t;
void dfs(int s,int k)
{
if(s==n+){t++;return;}
for(int i=;i<=k;i++)
{
if(!b[i]&&!c[i+s]&&!d[i-s+n-])
{
a[s]=i;
b[i]=;
c[i+s]=;
d[i-s+n-]=;
if(n%==&&a[]==(n+)/&&s==)dfs(,(n+)/-);
else dfs(s+,n);
b[i]=;
c[i+s]=;
d[i-s+n-]=;
}
}
}
int main()
{
cin>>n;
dfs(,(n+)/);
cout<<t*; return ;
}

代码

桐桐的数学游戏(N皇后)的更多相关文章

  1. Java实现桐桐的数学难题

    桐桐的数学难题 题目描述 今天数学课上,桐桐学习了质数的知识:一个正整数如果只能被1和它本身整除,那么这个整数便是质数.桐桐就想:任意一个正整数是否都能分解成若干个质数相乘的形式呢?输入一个正整数n( ...

  2. 桐桐的贸易--WA

    问题 A: 桐桐的贸易 时间限制: 1 Sec  内存限制: 64 MB提交: 15  解决: 2[提交][状态][讨论版] 题目描述 桐桐家在Allianceance城,好友ROBIN家在Horde ...

  3. Vijos P1325桐桐的糖果计划

    > P1325桐桐的糖果计划 标签:**图结构 强连通分量** 描述 桐桐很喜欢吃棒棒糖.他家处在一大堆糖果店的附近. 但是,他们家的区域经常出现塞车.塞人等情况,这导致他不得不等到塞的车或人走 ...

  4. vijos1325 桐桐的糖果计划

    Description 桐桐是一个快乐的小朋友,他生活中有许多许多好玩的事,让我们一起来看看吧-- 桐桐很喜欢吃棒棒糖.他家处在一大堆糖果店的附近. 但是,他们家的区域经常出现塞车.塞人等情况,这导致 ...

  5. 桐桐的糖果计划(vijos 1325)

    背景 桐桐是一个快乐的小朋友,他生活中有许多许多好玩的事,让我们一起来看看吧…… 描述 桐桐很喜欢吃棒棒糖.他家处在一大堆糖果店的附近. 但是,他们家的区域经常出现塞车.塞人等情况,这导致他不得不等到 ...

  6. 【2018寒假集训 Day1】【位运算】桐桐的运输方案

    桐桐的运输方案(transp) [问题描述] 桐桐有 N 件货物需要运送到目的地,它们的重量和价值分别记为: 重量:W1,W2,…,Wn: 价值:V1,V2,…,Vn: 已知某辆货车的最大载货量为 X ...

  7. VIJOS-P1325 桐桐的糖果计划

    VIJOS-P1325 桐桐的糖果计划 JDOJ 1432 桐桐的糖果计划 https://neooj.com/oldoj/problem.php?id=1432 Description 桐桐很喜欢吃 ...

  8. 20180606模拟赛T4——数学游戏

    数学游戏 题目描述: 小T又发脑残了,没错,她又要求奇怪的东西,这次她想知道[X,Y]之间整数有多少可以表示成K个不同的B的幂的和形势.如\(x,y,k,b=15,20,2,2\),则有: \[17= ...

  9. Vijos P1325桐桐的糖果计划(有向图双连通分量)

    /*重边不能删 不能删 不能删...*/ #include<iostream> #include<cstdio> #include<cstring> #define ...

随机推荐

  1. MQ选型之RabbitMQ

    RabbitMQ是部署最广泛的开源消息代理.[官方原话] 前言: MQ 是什么?队列是什么,MQ 我们可以理解为消息队列(message queue),队列我们可以理解为管道.以管道的方式做消息传递. ...

  2. vue打包项目后使用-webkit-line-clamp: 2;这个属性不生效?

    在项目中要实现多行省略,-webkit-line-clamp: 2;打包后不生效,使用下面的方法: word-break: break-all; text-overflow: ellipsis; di ...

  3. 关于main函数的参数问题

    我们经常用的main函数都是不带参数的.因此main 后的括号都是空括号.实际上,main函数可以带参数,这个参数可以认为是 main函数的形式参数.C语言规定main函数的参数只能有两个, 习惯上这 ...

  4. vscode 配置php

    vscode 的官网:https://code.visualstudio.com/docs/languages/php 添加扩张程序: php的设置: php格式化是安装“PHP Intelephen ...

  5. 如果Android真的收费了,你怎么看?

    前言 今天突然看到一群里有人发了下面这样一张图片,然后群里又炸了!   于是又和同事讨论了android收费的问题,然后隔壁正在玩农药的UI妹子就笑了... 没错! 安卓可能要收费了!安卓可能要收费了 ...

  6. Confluence 6 用户提交的备份和恢复脚本

    下面的代码是用户提交的,在使用的时候需要小心,因为 Atlassian 不提供这些代码的技术支持.如果你在使用或者修改这些代码的时候有任何问题,请粘贴到 post them to Atlassian ...

  7. 页面初始化的js函数要放在最最最最最最最前边!否则没效果

    简单说一下这个情况,html的页面的各部分都是动态渲染的,所以头部的某些个样式调用函数需要在页面初始化的时候被加载,这个我也是知道的,结果后边代码敲着敲着,就把这个事儿给忘了,然后启动项目的时候,页面 ...

  8. vue指令问题

    挂载点:最外层标签就是vue实例的挂载点,即id或者类对应的 dom节点 模板:指挂载点内部的内容,在实例里使用template标签来构 建 h1标签放在body里面不使用 “template”是一样 ...

  9. selenium 操作复选框

    场景 从上一节的例子中可以看出,webdriver可以很方便的使用findElement方法来定位某个特定的对象,不过有时候我们却需要定位一组对象, 这时候就需要使用findElements方法. 定 ...

  10. C++ friend友元函数和友元类(转)

    一个类中可以有 public.protected.private 三种属性的成员,通过对象可以访问 public 成员,只有本类中的函数可以访问本类的 private 成员.现在,我们来介绍一种例外情 ...