标签:des style blog class code java
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2553
题目
1 8 5 0
1 92 10
第一种没有优化的,用时间换空间。。第二种优化的,用空间换时间。。。
使用递归就要注意递归边界,否则会出现无穷递归。。。还要找到满足条件。。
第一种是从行开始搜索,然后遍历列,然后是遍历cur前面的行,是否与现在放置的皇后产生冲突。。
因为不能同行,同列,同对角线。。所以条件cur-C[cur]=j-C[j]或者cur+C[cur]=j+C[j]..可以通过行列式得出规律。。
还有就是要注意打表。。不然会超时。。。。
代码如下:
#include<cstdio>
#include<cstring>
const int maxn=100;
int n,tot,C[maxn],pos[maxn];
void dfs(int cur,int n,int k)
{
int i,j;
if(cur==n) pos[k]++;
else
{
for(i=0;i<n;i++)//遍历列
{
int ok=1;
C[cur]=i;
for(j=0;j<cur;j++)//遍历上面的行
{
if(C[cur]==C[j]||cur+C[cur]==j+C[j]||cur-C[cur]==j-C[j])
ok=0;
}
if(ok)
dfs(cur+1,n,k);
}
}
}
int main()
{
int i;
memset(C,0,sizeof(C));
memset(pos,0,sizeof(pos));
for(i=0;i<11;i++)
dfs(0,i,i);
while(scanf("%d",&n)!=EOF)
{
if(n==0) return 0;
printf("%d\n",pos[n]);
}
return 0;
}
vis[0][i]=vis[1][cur+i]=vis[2][cur-i+n]=1;
代码如下
#include<cstdio>
#include<cstring>
const int maxn=100;
int n,tot,C[maxn],pos[maxn];
int vis[3][maxn];
void Dfs(int cur,int n,int k)
{
int i,j;
if(cur==n) pos[k]++;
else
{
for(i=0;i<n;i++)//遍历列
{
if(!vis[0][i]&&!vis[1][cur+i]&&!vis[2][cur-i+n])
{
C[cur]=i;
vis[0][i]=vis[1][cur+i]=vis[2][cur-i+n]=1;
Dfs(cur+1,n,k);
vis[0][i]=vis[1][cur+i]=vis[2][cur-i+n]=0;
}
}
}
}
int main()
{
int i;
memset(C,0,sizeof(C));
memset(pos,0,sizeof(pos));
for(i=0;i<11;i++)
Dfs(0,i,i);
while(scanf("%d",&n)!=EOF)
{
if(n==0) return 0;
printf("%d\n",pos[n]);
}
return 0;
}
标签:des style blog class code java
原文地址:http://blog.csdn.net/u014303647/article/details/25472949