您的位置:首页 > 其它

HDU 1016 Prime Ring Problem DFS + 记忆化搜索

2011-05-04 20:04 387 查看
说实话,这题真没做出来,思路有,但是有问题一直不能解决,后来别人提供的思路.

不多说了....

这题就是要求形成一个环,没两个相邻的数之和不能为素数,当然最后一个要考虑他跟第一个的关系,这里的DFS其实只要递归一个东西,而我递归的东西却一直不对,主要受变形课影响,其实递归的东西肯定是当前的数目,然后把当前的数存在数组里,以便下一次递归的时候可以跟这一次的数比较....

#include<stdio.h>
#include<string.h>
int n,num[25],des[25];
int gcd( int n )
{
int f = 0;
if( n == 2 || n == 3 )
return 1;
for( int i = 2; i <= n / 2; ++i )
if( n % i == 0 )
return 0;
return 1;
}
void DFS( int x )
{
if( x == n && gcd( num
+ 1 ) )//当到最后一个时
{
for( int i = 1; i <= n; ++i )
printf( i == 1 ? "%d": " %d",num[i] );//满足条件则直接输出来
puts( "" );
}
else
{
for( int i = 2; i <= n; ++i )
{
if( !des[i] && gcd( i + num[x] ) )//查找满足条件的数
{
des[i] = 1;//记忆
num[x+1] = i;
DFS( x + 1 );
des[i] = 0;//回溯
}
}
}
}
int main( )
{
int t = 0;
while( scanf( "%d",&n ) != EOF )
{
memset( num,0,sizeof( num ) );
memset( des,0,sizeof( des ) );
des[1] = num[1] = 1;
printf( "Case %d:\n",++t );
DFS( 1 );
puts( "" );
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: