HDOJ2553(2N皇后问题)

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
const int MAX_N=100;
int N;
int vis[3][MAX_N];
int ans;
int dp[MAX_N];
void dfs(int r, int c,int n)
{
	if(r==n)
	{
		ans++;
		return ;
	}
	for(int i=0; i<n; i++)
	{
		if(!vis[0][i]&&!vis[1][r+i]&&!vis[2][r-i+N-1])
		{
			vis[0][i]=vis[1][r+i]=vis[2][r-i+N-1]=1;
			dfs(r+1,i,n);
			vis[0][i]=vis[1][r+i]=vis[2][r-i+N-1]=0;
		}
	}
}

int main()
{
	for(int j=1; j<=10; j++)
	{
		ans=0;
		for(int i=0; i<j; i++)
		{
			memset(vis, 0, sizeof(vis));
			vis[0][i]=vis[1][0+i]=vis[2][0-i+N-1]=1;//主对角线上个元素行列之和相等,次对角线上个元素行列之差相等,为避免行列之差为负值,将结果加上N-1;
			dfs(1,i,j);
		}
		dp[j]=ans;
	}
	while(scanf("%d",&N)&&N!=0)
	{
		printf("%d\n",dp[N]);
	}
	return 0;
}
时间: 2024-08-03 08:21:52

HDOJ2553(2N皇后问题)的相关文章

2n皇后问题

在蓝桥杯基础训练题中,出现这样一道题目: 问题描述 给定一个n*n的棋盘,棋盘中有一些位置不能放皇后.现在要向棋盘中放入n个黑皇后和n个白皇后,使任意的两个黑皇后都不在同一行.同一列或同一条对角线上,任意的两个白皇后都不在同一行.同一列或同一条对角线上.问总共有多少种放法?n小于等于8. 输入格式 输入的第一行为一个整数n,表示棋盘的大小. 接下来n行,每行n个0或1的整数,如果一个整数为1,表示对应的位置可以放皇后,如果一个整数为0,表示对应的位置不可以放皇后. 输出格式 输出一个整数,表示总

对八皇后的补充以及自己解决2n皇后问题代码

有了上次的八皇后的基础.这次准备解决2n皇后的问题,: //问题描述// 给定一个n*n的棋盘,棋盘中有一些位置不能放皇后.现在要向棋盘中放入n个黑皇后和n个白皇后,使任意的两个黑皇后都不在同一行.//同一列或同一条对角线上,任意的两个白皇后都不在同一行.同一列或同一条对角线上.问总共有多少种放法?n小于等于8.//输入格式// 输入的第一行为一个整数n,表示棋盘的大小.// 接下来n行,每行n个0或1的整数,如果一个整数为1,表示对应的位置可以放皇后,如果一个整数为0,表示对应的位置不可以放皇

蓝桥--2n皇后问题(递归)--搬运+整理+注释

N皇后问题: 1 #include <iostream> 2 #include <cmath> 3 using namespace std; 4 5 int N; 6 int queenPos[100];//用来存放算好的皇后位置.最左上角是(0,0) 7 8 void NQueen(int k); 9 10 int main() 11 { 12 cin >> N; 13 NQueen(0); //从第0行开始摆皇后 14 return 0; 15 } 16 void

BASIC-27 2n皇后问题

问题描述 给定一个n*n的棋盘,棋盘中有一些位置不能放皇后.现在要向棋盘中放入n个黑皇后和n个白皇后,使任意的两个黑皇后都不在同一行.同一列或同一条对角线上,任意的两个白皇后都不在同一行.同一列或同一条对角线上.问总共有多少种放法?n小于等于8. 输入格式 输入的第一行为一个整数n,表示棋盘的大小. 接下来n行,每行n个0或1的整数,如果一个整数为1,表示对应的位置可以放皇后,如果一个整数为0,表示对应的位置不可以放皇后. 输出格式 输出一个整数,表示总共有多少种放法. 样例输入 41 1 1

蓝桥杯训练 2n皇后

问题描述 给定一个n*n的棋盘,棋盘中有一些位置不能放皇后.现在要向棋盘中放入n个黑皇后和n个白皇后,使任意的两个黑皇后都不在同一行.同一列或同一条对角线上,任意的两个白皇后都不在同一行.同一列或同一条对角线上.问总共有多少种放法?n小于等于8.输入格式 输入的第一行为一个整数n,表示棋盘的大小. 接下来n行,每行n个0或1的整数,如果一个整数为1,表示对应的位置可以放皇后,如果一个整数为0,表示对应的位置不可以放皇后.输出格式 输出一个整数,表示总共有多少种放法.样例输入41 1 1 11 1

[蓝桥杯][基础练习VIP]2n皇后问题

时间限制: 1Sec 内存限制: 128MB 提交: 26 解决: 18 题目描述 给定一个n*n的棋盘,棋盘中有一些位置不能放皇后.现在要向棋盘中放入n个黑皇后和n个白皇后,使任意的两个黑皇后都不在同一行.同一列或同一条对角线上,任意的两个白皇后都不在同一行.同一列或同一条对角线上.问总共有多少种放法?n小于等于8. 输入 输入的第一行为一个整数n,表示棋盘的大小. 接下来n行,每行n个0或1的整数,如果一个整数为1,表示对应的位置可以放皇后,如果一个整数为0,表示对应的位置不可以放皇后. 输

基础练习 2n皇后问题

1 #include<iostream> 2 #include<math.h> 3 4 using namespace std; 5 #define Len 1000 6 7 int b[Len][Len]; 8 int a[Len]= {0}; 9 int c[Len]= {0}; 10 int count=0; 11 int m; 12 bool check(int n, int i, int k) { 13 if(b[n][i] == 0){ 14 return false;

例题2.1 象棋中的皇后 UVa11538

1.题目描述:点击打开链接 2.解题思路:本题利用加法原理解决.本题要求统计有多少种放置方法,可以使两个皇后相互攻击.因为只有2个皇后,而能够相互攻击的情况只有3种:同一行,同一列,同一对角线.这3种情况都没有交集,因此可以使用加法原理.设三种情况对应的方案数分别为A(n,m),B(n,m),D(n,m).下面讨论如何计算这三个值. A(n,m)的计算可以利用乘法原理:首先选择一格,一共有nm种选法,接下来再选一行中的其他位置,一共只有m-1个位置,因此A(n,m)=nm(m-1). B(n,m

n皇后问题——关于斜线的编号

题目大意:在n*n的棋盘中,放置n个皇后(同一行.同一列.同一斜线,只有一个皇后) 这道题是一道非常经典的dfs模板题,同一行.同一列的判断不是很难,但同一斜线有一定的难度,下面给出关于斜线编号的解决方法 我们就先以4*4的棋盘为例 我们把被标红的这一条暂且称之为主对角线 观察一下主对角线上的点坐标规律 我们发现主对角线上的点的坐标(x,y)满足x==y 下面看看其他的斜线有怎样的性质 在蓝色这条斜线上的坐标(x,y)满足x-y==1 在粉色这条斜线上的坐标(x,y)满足x-y==-1 同样的,