您的位置:首页 > 其它

Prime Ring Problem(HDU1016)(A)

2016-10-05 11:20 351 查看
どこでもドア:http://acm.hdu.edu.cn/showproblem.php?pid=1016

一个环放从1到n的n个数,第一个位置一定放1。剩下的满足与之前的数相加为素数,输出所有情况。注意是环,首尾也要合法。

AC CODE:

#include<iostream>
#include<cstdio>
#include<algorithm>
#include <cmath>
#include <cstring>
#include <string>
#include<sstream>
#include<set>
#include <cstdlib>
#include<map>
using namespace std;
const int M=32;
int n,ma[M],cnt,ans[M];
int pri[12]={3,5,7,11,13,17,19,23,29,31,37,39};//数据范围小,所有和的素数直接写出来了。
int K=1;

bool check(int x,int y)  //检验和是否是素数
{
x+=y;
for(int i=0;i<12;i++){
if(pri[i]==x)
return 1;
}
return 0;
}

void DFS(int x)
{
if(cnt>=n) //cnt记录了放入了几个数,全合法放入后return
{//ans记录了对应位置放入的数字
if(check(ans[n-1],1)){
cout<<ans[0];
for(int i=1;i<n;i++)
cout<<" "<<ans[i];
cout<<endl;
}
return ;
}
else
{
for(int i=1;i<=n;i++)
{
if(check(i, x)&&!ma[i])//ma来记录访问的状态
{
ma[i]=1;
ans[cnt]=i;
cnt++;
DFS(i);
//搜索后回溯到这个节点要还原访问之前的状态
ma[i]=0;
cnt--;
}
}
}
return ;
}

int main()
{
while(cin>>n)
{
cout<<"Case "<<K++<<":"<<endl;
memset(ma,0,sizeof(ma));
cnt=1;
ans[0]=1;
ma[1]=1;
DFS(1);
cout<<endl;
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: