首页 > 其他 > 详细

HDOJ2553(2N皇后问题)

时间:2015-08-30 22:53:39      阅读:227      评论:0      收藏:0      [点我收藏+]
#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;
}

 

HDOJ2553(2N皇后问题)

原文:http://www.cnblogs.com/program-ccc/p/4771659.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!