列表

详情


NC200475. 素数圆环

描述


如图所示为一个由n个圆圈构成的圆环。将自然数1,2,...,n放入圆圈内,并且要求任意两个相邻的圆圈内的数字之和为素数。请问给你圆圈数,你能给出放置自然数的所有正确方案吗?
注意:圆圈中的数字一定是从1开始的,并且连续不重复。

输入描述

输入包含多组测试数据。每组输入占一行,为整数n(0<n<20),表示圆圈数。

输出描述

对于每组输入,输出所有正确的方案,按字典序从小到大排序。每组输出后输出一个空行。具体输出格式见输出样例。

示例1

输入:

6
8

输出:

Case 1:
1 4 3 2 5 6
1 6 5 2 3 4

Case 2:
1 2 3 8 5 6 7 4
1 2 5 8 3 4 7 6
1 4 7 6 5 8 3 2
1 6 7 4 3 8 5 2

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++14(g++5.4) 解法, 执行用时: 3ms, 内存消耗: 352K, 提交时间: 2019-12-21 13:15:13

#include<bits/stdc++.h>
using namespace std;
int n,ts,vis[20],p[20];
int isprime(int x)
{
	for(int i=2;i*i<=x;i++)	if(x%i==0)	return 0;
	return 1;
}
void dfs(int x)
{
	if(x==n+1)
	{
		if(!isprime(p[n]+1))	return ;
		for(int i=1;i<=n;i++)
			if(i==n)	cout<<p[i]<<endl;
			else	cout<<p[i]<<' ';
		return ;
	}
	for(int i=2;i<=n;i++)
	{
		if(!vis[i]&&isprime(i+p[x-1]))
		{
			vis[i]=1;
			p[x]=i;
			dfs(x+1);
			vis[i]=0;
		}
	}
}
int main()
{
	p[1]=1,vis[1]=1;
	while(cin>>n)
	{
	//	if(ts)	cout<<endl;
		printf("Case %d:\n",++ts);
		dfs(2); puts("");
	}
	return 0;
}

C++11(clang++ 3.9) 解法, 执行用时: 4ms, 内存消耗: 348K, 提交时间: 2019-12-21 15:02:57

#include<bits/stdc++.h>
#define rep(i,s,e) for(int i=s; i<e; ++i)
using namespace std;
int n,cas,ans[25],vis[25];
int p[25]={0,0,1,1,0,1,0,1,0,0,0,1,0,1,0,0,0,1,0,1};
void dfs(int x){
	if(x>n&&p[ans[n]+1]) rep(i,1,n+1) 
		cout<<ans[i]<<(char)(i==n?'\n':' ');
	if(x<=n) rep(i,2,n+1) if(!vis[i]&&p[i+ans[x-1]]){
		vis[i]=1; ans[x]=i; dfs(x+1); vis[i]=0;
	}
}
void solve(){
	cout<<"Case "<<++cas<<":\n"; ans[1]=1;
	if(n%2==0) dfs(2); cout<<'\n';
}
int main(){
	while(cin>>n&&n) solve();
}

上一题