2n皇后问题(深搜dfs)
2016-01-04 18:37
267 查看
基础练习 2n皇后问题
问题描述
给定一个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
问题描述
给定一个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
#include<stdio.h> int sum=0; int p(int n,int x,int y,int m[][8],int s) { int i,j; for(i=x-1;i>=0;i--) { if(m[i][y]==s)return 0; } for(i=x-1,j=y-1;i>=0&&j>=0;i--,j--) { if(m[i][j]==s)return 0; } for(i=x-1,j=y+1;i>=0&&j<n;i--,j++) { if(m[i][j]==s)return 0; } return 1; } int h(int n,int x,int m[][8],int s) { int i; if(x==n) { if(s==2)h(n,0,m,3); else sum++; return 0; } for(i=0;i<n;i++) { if(m[x][i]!=1)continue; if(p(n,x,i,m,s))m[x][i]=s; else continue; h(n,x+1,m,s); m[x][i]=1; } return 0; } int main() { int n,m[8][8],i,j; scanf("%d",&n); for(i=0;i<n;i++) { for(j=0;j<n;j++) { scanf("%d",&m[i][j]); } } h(n,0,m,2); printf("%d",sum); return 0; }
相关文章推荐
- Python:数据流中查找特定子串的简单算法
- 给Xcode增加复制行、删除行快捷键的方法
- Linux中mysql以及phpmyadmin的安装与配置
- Spark 大数据平台
- 引用变量类型的加载顺序(类名+引用名=new +类名();)
- 不透明度16进制值
- Oracle创建外键约束
- ES 分页查询
- Docker实践一(安装配置) 基于centos6.5
- 环境搭建问题
- Linux大数据开发基础:第九节:Shell编程入门(一)
- 自建CA以及证书申请
- PhantomJS是一个基于WebKit的服务器端JavaScript API
- 机器学习概述
- 底部虚拟按键挡住PopupWindow显示
- 《VR入门系列教程》之4---运行平台
- PhantomJS是一个基于WebKit的服务器端JavaScript API
- Android屏幕适配常识
- redis主从同步及切换主从配置示例
- IOS 分享你最喜欢的技巧和提示