poj2034 dfs

来源:互联网 发布:大华录像机网络设置 编辑:程序博客网 时间:2024/05/29 14:27

冯如杯完了,有时间可以惬意的刷几道了。

这题是求n到m的一个排列,满足相邻的2个,3个……d个数的和都不为素数(都要满足)。

然后上代码,挺简单,是所以发代码,是觉得自己写得比较漂亮。(呵呵,不要喷我)

#include <iostream>using namespace std;bool ans,p[10010],h[1010];int n,m,d,a[1010],sum[11];void dfs(int dep) {     if (ans) return;     if (dep==m-n+2) {                     ans = true;                     for (int i=1;i<dep-1;i++)                         printf("%d,",a[i]);                     printf("%d\n",a[dep-1]);                     return;     }     for (int i=n;i<=m;i++)         if (!h[i]) {                    bool conti = 0;                    for (int k=2;k<=d;k++) {                        if (dep==k && p[sum[k]+i]) conti = 1;                        if (dep>k && p[sum[k]+i-a[dep-k]]) conti = 1;                    }                    if (conti==1) continue;                    h[i] = 1;                    a[dep] = i;                    for (int k=2;k<=d;k++) {                        sum[k] += i;                        if (dep>k) sum[k] -= a[dep-k];                    }                    dfs(dep+1);                    for (int k=2;k<=d;k++) {                        sum[k] -= i;                        if (dep>k) sum[k] += a[dep-k];                    }                    h[i] = 0;         }}int main() {    memset(p,1,sizeof(p));    p[1] = 0;    for (int i=2;i<=10000;i++)        if (p[i]) for (int j=i+i;j<=10000;j+=i) p[j] = false;    while (~scanf("%d%d%d",&n,&m,&d)) {          if (n==0 && m==0 && d==0) break;          memset(h,0,sizeof(h));          memset(sum,0,sizeof(sum));          ans = 0;          dfs(1);          if (!ans) printf("No anti-prime sequence exists.\n");    }    return 0;      }


原创粉丝点击