N皇后问题 HDU - 2553
2016-12-14 21:39
288 查看
在N*N的方格棋盘放置了N个皇后,使得它们不相互攻击(即任意2个皇后不允许处在同一排,同一列,也不允许处在与棋盘边框成45角的斜线上。
你的任务是,对于给定的N,求出有多少种合法的放置方法。
Input共有若干行,每行一个正整数N≤10,表示棋盘和皇后的数量;如果N=0,表示结束。
Output共有若干行,每行一个正整数,表示对应输入行的皇后的不同放置数量。
Sample Input
Sample Output
思路:明显是用回溯法,这里比较难的是对角线,列的状态表示,列的状态用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;
}
你的任务是,对于给定的N,求出有多少种合法的放置方法。
Input共有若干行,每行一个正整数N≤10,表示棋盘和皇后的数量;如果N=0,表示结束。
Output共有若干行,每行一个正整数,表示对应输入行的皇后的不同放置数量。
Sample Input
1 8 5 0
Sample Output
1 92 10
思路:明显是用回溯法,这里比较难的是对角线,列的状态表示,列的状态用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;
}
相关文章推荐
- 搜狗百度360市值齐跌:搜索引擎们陷入集体焦虑?
- 本人即将筹备败家日志,敬请期待!
- IE:使用搜索助手
- 在SQL Server 2005所有表中搜索某个指定列的方法
- Android的搜索框架实例详解
- C++深度优先搜索的实现方法
- 基于文本的搜索
- php实现搜索一维数组元素并删除二维数组对应元素的方法
- 使用Sphinx对索引进行搜索
- asp 多关键词搜索的简单实现方法
- C#使用foreach语句搜索数组元素的方法
- WordPress中用于获取搜索表单的PHP函数使用解析
- easyui combobox开启搜索自动完成功能的实例代码
- 使用JS轻松实现ionic调用键盘搜索功能(超实用)
- JavaScript中数组的排序、乱序和搜索实现代码
- jquery ztree实现树的搜索功能
- 【经典源码收藏】jQuery实用代码片段(筛选,搜索,样式,清除默认值,多选等)
- Ajax实现智能提示搜索功能
- C#编程实现Excel文档中搜索文本内容的方法及思路
- sqlserver中在指定数据库的所有表的所有列中搜索给定的值