博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
蓝桥杯 基础练习 2n皇后问题 (简单dfs暴力+优化剪枝)
阅读量:4139 次
发布时间:2019-05-25

本文共 1126 字,大约阅读时间需要 3 分钟。

  基础练习 2n皇后问题  
时间限制:1.0s   内存限制:512.0MB
   
   
问题描述
  给定一个n*n的棋盘,棋盘中有一些位置不能放皇后。现在要向棋盘中放入n个黑皇后和n个白皇后,使任意的两个黑皇后都不在同一行、同一列或同一条对角线上,任意的两个白皇后都不在同一行、同一列或同一条对角线上。问总共有多少种放法?n小于等于8。
输入格式
  输入的第一行为一个整数n,表示棋盘的大小。

  接下来n行,每行n个0或1的整数,如果一个整数为1,表示对应的位置可以放皇后,如果一个整数为0,表示对应的位置不可以放皇后。
输出格式
  输出一个整数,表示总共有多少种放法。
样例输入
4

1 1 1 1

1 1 1 1

1 1 1 1

1 1 1 1
样例输出
2
样例输入
4

1 0 1 1

1 1 1 1

1 1 1 1

1 1 1 1
样例输出
0
/*思路:枚举  然后检测,回朔 总共有s=n*n个点   对于每个点 横坐标为s/now,纵坐标为s%n  水平方向  只需要检查0到s/now竖直方向  只需要检查0到s%now斜线方向 只需要检查左上和右上 能到达s就为一种方案 累加 */#include 
#include
#include
using namespace std;const int N=10;int map[N][N]; //0不能放 1可以放 2是黑皇后 3是白皇后 bool row[N][2],column[N][2]; //标记横列有没放 优化速度 0代表黑,1代表白 二维数组 int n,re;inline bool check(int x,int y,int v){ //检查横竖和斜线 int i,a,b; //检查横 /*for(i=0;i
=n) break; if(map[a][b]==v) return false; } return true;}void dfs(int now){ int x=now/n; int y=now%n; //优化 到目前行位置前面每行行都有各一个黑白皇后 for(int i=0;i
>n){ re=0; memset(row,0,sizeof(row)); memset(column,0,sizeof(column)); for(i=0;i
>map[i][j]; dfs(0); cout<
<

转载地址:http://gfmvi.baihongyu.com/

你可能感兴趣的文章
如何用C语言获取系统的用户登录名?
查看>>
如何用C语言获取系统的sid信息?
查看>>
C/C++中如何写长串(字符数组的拼接)?
查看>>
strtok函数真是个蹩脚而又恶心的设计(千万不要嵌套使用strtok函数)
查看>>
Windows和Linux的netstat
查看>>
C++如何实现string的trim功能? (已经包含trimLeft和trimRight)
查看>>
如何确保一个函数的被调用次数不少于另外一个函数的被调用次数?
查看>>
从netstat看网络编程
查看>>
ssh, telnet在发起什么连接请求?
查看>>
利用STL中的map来写一个自己的命令行界面
查看>>
127.0.0.1和0.0.0.0
查看>>
什么是抓包?为什么要抓包?
查看>>
第一年的年终奖
查看>>
git, svn------那一年, 我与软件配置管理职位擦肩而过(现在想来, 也算幸事)
查看>>
《HP大中华区总裁孙振耀退休感言》--- 我又读了一遍, 真的非常受益! 朋友, 我推荐给你!
查看>>
我心目中的代码三要素
查看>>
Windows TortoiseSVN和Linux SVN入门
查看>>
你该怎样用svn才能避免冲突? (内附逻辑图和详细解释)
查看>>
什么是NAT?
查看>>
小小捣鼓一下手机和电脑---有助于理解NAT
查看>>