HDU 2553 N皇后问题
来源:互联网 发布:工程机械行业数据 编辑:程序博客网 时间:2024/05/09 07:18
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2553
N皇后问题
Problem Description
在N*N的方格棋盘放置了N个皇后,使得它们不相互攻击(即任意2个皇后不允许处在同一排,同一列,也不允许处在与棋盘边框成45角的斜线上。
你的任务是,对于给定的N,求出有多少种合法的放置方法。
你的任务是,对于给定的N,求出有多少种合法的放置方法。
Input
共有若干行,每行一个正整数N≤10,表示棋盘和皇后的数量;如果N=0,表示结束。
Output
共有若干行,每行一个正整数,表示对应输入行的皇后的不同放置数量。
Sample Input
1850
Sample Output
19210
分析:题目意思就是在某一行的某一列放置一个皇后,然后在他的同一行,同一列以及45°对角线都不能放置皇后,求存在多少种放置方案。所以的话,我的思路就是用从第一行开始遍历,用一个数组id[i]表示第i行的皇后放置在哪一列。由于我是按行遍历的,因此在考虑当前行当前列是否可以放置的时候,只需要考虑是否同一列或者在45°对角线上,同一列的问题,可以考虑cur行之前的放置情况,用id[cur]与id[i]来判断,cur表示当前行;对角线的问题,很容易可以发现,判断它们斜率的绝对值是否等于1(紫书上也有一种判断方法,菜鸟没看懂,只能用自己的方法来判断),如果可以放置,则进行cur+1行的操作,直到n-1行,否则考虑另一列。判断一套方案是否成立的条件是cur==n。下面代码用了预处理的方法~
下面上代码:
#include<iostream>#include<cstdio>#include<cmath>#include<cstring>using namespace std;int id[12];int n;int count1;int a[12];void dfs(int cur,int t){ if(cur==t) { a[t]++; } else { for(int i=0;i<t;i++) { id[cur]=i; int flag=1; for(int j=0;j<cur;j++) { if(id[cur]==id[j]||abs(cur-j)==abs(id[cur]-id[j])) { flag=0; break; } } if(flag==1) dfs(cur+1,t); } }}int main(){ memset(a,0,sizeof(a)); for(int i=1;i<=10;i++) { dfs(0,i); } while(~scanf("%d",&n)&&n) { printf("%d\n",a[n]); } return 0;}
0 0
- HDU 2553 N皇后问题
- HDU 2553 N皇后问题
- HDU 2553-N皇后问题
- hdu 2553 N皇后问题
- HDU-2553-N皇后问题
- Hdu 2553 N皇后问题
- hdu 2553 N皇后问题
- hdu 2553 N皇后问题
- HDU 2553 N皇后问题
- HDU--2553 -- N皇后问题
- hdu-2553--N皇后问题
- 2553--Hdu--N皇后问题
- N皇后问题 hdu 2553
- HDU 2553 N皇后问题
- hdu 2553 n皇后问题
- HDU 2553 N皇后问题
- hdu-2553-N皇后问题
- HDU-2553-N皇后问题
- Bundle savedInstanceState的作用
- Activity生命周期
- linux用户组与权限管理
- JNI接口-深入研究参数的传递(一)
- mac 安装nginx
- HDU 2553 N皇后问题
- EventBus使用详解
- 网络工程师(上)
- <LeetCode> 题13:字符串查找(strstr)
- Leetcode no. 134
- 作业3
- cf#362-D - Puzzles-树DP /概率
- 网络工程师(下)
- ButterKnife的使用,再也不用写findviewById