N皇后问题 HDU - 2553
来源:互联网 发布:淘宝上一千多的三星s6 编辑:程序博客网 时间:2024/06/05 15:29
你的任务是,对于给定的N,求出有多少种合法的放置方法。
1850
Sample Output
19210思路:明显是用回溯法,这里比较难的是对角线,列的状态表示,列的状态用vis[0][j]表示即可,对角线的表示比较麻烦,所以我用了刘汝佳的表示方法,vis[1][i+j]表示主对角线的状态,vis[2][j-i+n]来表示副对角线的状态(因为j-i有可能是负的,所以加n)
下面是ac代码(有可能因为测试数据过大,如果显示超时,直接打表)
#include<cstdio>
#include<string.h>
int vis[3][100],n,ans;
void dfs(int x)
{
if(x>=n)
{
ans++;
return;
}
for(int i=0;i<n;i++)
{
if(!vis[0][i]&&!vis[1][i+x]&&!vis[2][i-x+n])
{
vis[0][i]=vis[1][i+x]=vis[2][i-x+n]=1;
dfs(x+1);
vis[0][i]=vis[1][i+x]=vis[2][i-x+n]=0;
}
}
}
int main()
{
while(~scanf("%d",&n))
{
memset(vis,0,sizeof(vis));
ans=0;
dfs(0);
printf("%d\n",ans);
}
}
打表代码:
#include<cstdio>
#include<string.h>
#define maxn 20
int vis[3][maxn],n,ans;
int dfs(int x)
{
if(x==2||x==3)
return 0;
else if(x==1)
return 1;
else if(x==4)
return 2;
else if(x==5)
return 10;
else if(x==6)
return 4;
else if(x==7)
return 40;
else if(x==8)
return 92;
else if(x==9)
return 352;
else if(x==10)
return 724;
}
int main()
{
while(scanf("%d",&n)!=EOF)
{
if(n==0)
return 0;
memset(vis,0,sizeof(vis));
ans=0;
ans=dfs(n);
printf("%d\n",ans);
}
return 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皇后问题
- 大数据学习笔记(三)-k-均值聚类&多维缩放找聚类
- git命令速查
- MyBatis:简单物理分页实现(Plugin)
- Hello World
- 一点一滴学习Spring(五)之Spring MVC
- N皇后问题 HDU - 2553
- c++数据结构与算法分析一(各种排序算法以及优劣分析)
- 网络编程的理论知识-五类IP的范围
- C/C++语言库函数atoi字符串转换成整型数
- 第16周项目3 -归并排序算法的改进
- Dojo1.11官方教程文档翻译(4.9)使用dojo/hash和dojo/router
- TMG server ISA server 批量添加域名集
- 禁用cookie如何使用session
- RFID原理与应用1