UVA 524 HDU 1016Prime Ring Problem

题意:就是给你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;
 }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值