HDU 1016 Prime Ring Problem

myhalfsea posted @ 2010年3月16日 02:29 in ACM , 867 阅读

#include<iostream>
using namespace std;

//素数表,加快后续判断
int prime[38] = {0,0,1,1,0,1,0,1,0,0,0,1,0,1,0,0,0,1,0,1,0,0,0,1,0,0,0,0,0,1,0,1,0,0,0,0,0,1}; 
int n, cas = 1;
int vis[21], num[21];

void dfs( int cur ) {
    int i;
    if ( cur == n && prime[num[0] + num[n-1]] ){ //递归边界,测试第一个数和最后一个数
        cout << num[0] ;
        for ( i = 1; i < n; i++ )
            cout << " "<< num[i];
         cout << endl;
    }
    else {
         for(int i = 2;i <= n; ++i) //尝试放置每一个数i
         if( !vis[i] && prime[i + num[cur-1]]) //如果i没有用过,并且与前面一个数之和为素数
         { 
             num[cur] = i;  //将该数放进A中
             vis[i] = 1;    //设置使用标志
             dfs(cur + 1);  //递归调用
             vis[i] = 0;    //将标志改回来,清除标志
         }
     }
}

int main()
{
    num[0] = 1;  //1的位置不变
    while ( cin >> n ) {
        memset(vis, 0, sizeof(vis) );  //标记数组清零
        cout << "Case " << cas++ <<":\n";
        dfs(1); 
        cout << endl; 
    }

    return 0;
}


登录 *


loading captcha image...
(输入验证码)
or Ctrl+Enter
Host by is-Programmer.com | Power by Chito 1.3.3 beta
Butterfly Theme | Design: HRS Hersteller of mobile Hundeschule.