poj2034 dfs

1934 단어
풍여잔이 끝났으니 시간이 있으면 즐겁게 몇 줄 닦아도 된다.
이 문제는 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
",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.
"); } return 0; }

좋은 웹페이지 즐겨찾기