题意:就是给你n个数 用这n个数让你求一个环 这个环相邻两边的数字和都是素数,输出从1这个位置逆顺序输出
我的代码 UVA PE 但是HDU 过了 我是真不知道为啥
题解:就是暴力+回溯,因为第一个数是1,可以一个一个判断并且回溯。
我这里没有用素数打表 其实用打表可能更快一点;
#include <bits/stdc++.h>
using namespace std;
int vis[20];
int a[20];
int n;
int isp(int x)
{
if(x==1)
{
return 0;
}
for(int i=2;i<x;i++)
{
if(x%i==0)
{
return 0;
}
}
return 1;
}
int xx=0;
void dfs(int cur)// cur判断的是层数
{
if(cur==(n+1)&&isp(a[1]+a[n]))//判断是否进行到了最后一个数的判断
{
for(int i=1;i<n;i++)
{
cout<<a[i]<<" ";//注意格式的输出
}
if(n>=1)
{
cout<<a[n]<<endl;
}
}
else
{
for(int i=2;i<=n;i++)
{
if(!vis[i]&&isp(i+a[cur-1]))//判断边界
{
a[cur]=i;
vis[i]=1;
dfs(cur+1);
vis[i]=0;//注意清除标记
}
}
}
}
int main()
{
while(cin>>n)
{
xx++;
cout << "Case " << xx << ":" << endl;
a[1]=1;
memset(vis,0,sizeof(vis));
dfs(2);
cout<<endl;
}
return 0;
}