2011-12-27 12:56:41

地址:http://acm.hdu.edu.cn/showproblem.php?pid=1016

题意:输入n,输出满足条件的1开头的n个数的排列。条件是相邻两个元素和为素数,而且首尾和为素数。

mark:直接dfs。其实非1奇数的情况不存在解。因为总有2个加起来是偶数。

代码:

# include <stdio.h>


int num[25] = {1} ;
int visited[25] = {0, 1} ;
int n ;


int isprime (int n)
{
// 0 1 2 3 4 5 6 7 8 9
int tab[] ={0, 0, 1, 1, 0, 1, 0, 7, 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, 0, 0} ;
return tab[n] ;
}


void dfs (int pos)
{
int i ;
if (pos == n)
{
if (isprime(num[n-1]+1))
{
for (i = 0 ; i < n ; i++)
printf (((i==0)?"%d":" %d"), num[i]) ;
printf ("\n") ;
}
return ;
}

for (i = 1 ; i <= n ; i++)
{
if (visited[i] == 1) continue ;
if (!isprime(i+num[pos-1])) continue ;
visited[i] = 1 ;
num[pos] = i ;
dfs (pos+1) ;
visited[i] = 0 ;
}
}


int main ()
{
int nCase = 1 ;
while (~scanf ("%d", &n))
{
printf ("Case %d:\n", nCase++) ;
dfs (1) ;
printf ("\n") ;
}
return 0 ;
}