您的位置:首页 > 其它

zoj 1457 Prime Ring Problem

2011-02-23 12:24 351 查看
好早以前见过,恩,没做。。



今天见了,就做试试。



很早以前在CSDN的学生大本营见过有人提出这种问题,就是将20个数绕成环,相邻两个数的和是素数。当时有人提出思路就是,相邻两个数肯定是一奇一偶,然后神马的记不起来了。



按照这个思路,DFS,第几个位置搜索和它奇偶性相同的数并且判断它和前一个数是否加和是素数即可,这个判断可以筛个素数表。。。如果n为奇数肯定是不满足的。



提交就PE了,还挺嗨皮,木有WA or TLE。。。改了几次还是PE = =。。。



注意,输出不要有多余空格,如果n为奇数,输出一个空行就行了 = =。。。



#include <queue>
#include <stack>
#include <math.h>
#include <stdio.h>
#include <stdlib.h>
#include <iostream>
#include <limits.h>
#include <string.h>
#include <algorithm>
#define MAX 25
using namespace std;
int n;
int vis[MAX];
int pr[100];
int out[MAX];
int cou;
void init()
{
	int i,k;
	for(i=0; i<100; i++)
		pr[i] = 1;
	pr[0] = pr[1] = 0;
	for(i=2; i<100; i++)
		for(k=2; k*i<100; k++)
			if( pr[i] == 1 )
				pr[k*i] = 0;
}
void DFS()
{
	int i;
	if( cou-1 == n && pr[out[cou-1]+out[1]] == 1 )
	{
		printf("%d",out[1]);
		for(i=2; i<=n; i++)
			printf(" %d",out[i]);
		printf("/n");
		return ;
	}
	for(i=1; i<=n; i++)
		if( cou % 2 == i % 2 && !vis[i] && pr[out[cou-1]+i] == 1 )
		{
			vis[i] = 1;
			out[cou] = i;
			cou++;
			DFS();
			vis[i] = 0;
			cou--;
		}
}
int main()
{
	int ind = 1,i;
	init();
	while( ~scanf("%d",&n) )
	{
		printf("Case %d:/n",ind++);
		if( n % 2 == 1 )
		{
			printf("/n");
			continue;
		}
		memset(vis,0,sizeof(vis));
		vis[1] = 1;
		cou = 1;
		out[cou] = 1;
		cou++;
		DFS();
		printf("/n");
	}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: