题解 UVA524 素数环 Prime Ring Problem
这道题的思路和P1706 全排列问题相似
从第一层开始搜索直到越界,当越界的时候来输出。
但是这题的输出问题一定要注意,从第二组开始就有换行,同时每组数据的最后没有空格
请勿抄袭
代码如下:
#include<bits/stdc++.h>//万能头真好用
using namespace std ;
int t ;
int ans[20] ;//存答案
bool vis[20] ;//判断这个数有没有取过
bool prime( int x )//判断素数,会更高端写法的可跳过QAQ
{
if ( x == 0 || x == 1 ) return 0 ;
for ( int i = 2 ; i <= sqrt(x) ; i++ )//一个小优化,只需要枚举到√n
{
if ( x % i == 0 ) return 0 ;
}
return 1 ;
}
void dfs( int x )
{
if ( x == t + 1 && prime ( ans[t] + ans[1] ) )/*当满足条件以及开头和末尾和是素数,这里补足没有判断首尾的情况*/
{
for ( int i = 1 ; i <= t - 1 ; i++ )
{
cout << ans[i] << " " ;
}
cout << ans[t] << endl ;
}
for ( int i = 2 ; i <= t ; i++ )//从第二层开始因为第一层是1
{
if ( prime ( i + ans[x - 1] ) && vis[i] == 0 )//如果这个数加上前一层的数的和是质数,并且这个数还没有被用过
{
ans[x] = i ;//把这个数放进这一层
vis[i] = 1 ;//把这个数标记为用过了
dfs( x + 1 ) ;//搜索下一层
ans[x] = 0 ;//回溯
vis[i] = 0 ;
}
}
}
int main()
{
//freopen("a.txt","w",stdout) ;
/*这行代码主要是用来在存代码的那个文件夹里生成一个a文件,将代码的输出提取到这个文件里面,用来dbug的,但是注意代码运行时是不会有输出的*/
int m = 1 ;
while ( cin >> t && t != EOF )
{
memset(ans,0,sizeof(ans)) ;
memset(vis,0,sizeof(vis)) ;
//清空数组好习惯
ans[1] = 1 ;//第一层的数一定是1,所以直接放进ans数组
vis[1] = 1 ;//标记
if ( m >= 2 ) cout << endl ;//从第二组数据开始才会每一个数据之间输出换行
cout << "Case " << m << ":" << endl ;
dfs(2) ;//从第二层开始搜索
m++ ;
}
return 0 ;
}