ArcTan

dfs
随笔 - 16, 文章 - 117, 评论 - 6, 引用 - 0
数据加载中……

poj2034----质数判断+bfs

http://poj.org/problem?id=2034

题目大意:
      给定0<m<n<=1000,1<d<11,求出m到n内的数的一个排列:
      使得连续的大于2小于等于d的长度的数字之和是合数。
#include<stdio.h>
#include
<string.h>
#include
<math.h>
int p[500005];
int ans,a[1005],b[1005],sum[10005];
int m,n,d;

int GetPri()
{
    
int i,j;
    memset(p,
0,sizeof(p));
    p[
1]=1;
    i
=2;
    
while (i<=500000)
    {
        
while (p[i])    i++;
        j
=i+i;
        
while (j<=500000)
        {
            p[j]
=1;
            j
+=i;
        }
        i
++;
    }
}

int dfs(int dep)
{
    
int i,k,flag;
    
if (ans)
        
return 0;
    
if (dep==n-m+2)
    {
        ans
=1;
        
for (i=1;i<n-m+1 ;i++ )
            printf(
"%d,",a[i]);
        printf(
"%d\n",a[i]);
        
return 0;
    }
    
for (i=m;i<=n ;i++ )
    {
        
if (!b[i])
        {
            flag
=1;
            
for (k=2;k<=d ;k++ )
            {
                
if (k<=dep&&!p[sum[dep-1]-sum[dep-k]+i])
                    flag
=0;
                
if (!flag||k>dep)
                    
break;
            }
            
if (!flag)
                
continue;

            a[dep]
=i;
            sum[dep]
=sum[dep-1]+i;
            b[i]
=1;
            dfs(dep
+1);
            b[i]
=0;
        }
    }
}

int main()
{
    GetPri();
    
while (scanf("%d%d%d",&m,&n,&d)==3)
    {
        
if (!m&&!n&&!d)
            
break;
        ans
=0;
        memset(sum,
0,sizeof(sum));
        memset(b,
0,sizeof(b));
        dfs(
1);
        
if (!ans)
            printf(
"No anti-prime sequence exists.\n");
    }
    
return 0;
}
水过一题。dfs还是很好写的哈


posted on 2012-05-04 17:00 wangs 阅读(207) 评论(0)  编辑 收藏 引用 所属分类: ACM-数学


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理