acm P1016 Prime Ring Problem(DFS深搜)

本文介绍了一个名为PrimeRing的问题,该问题是关于在一个由n个圆圈组成的环形结构中填入1至n的自然数,使得相邻两圆圈内的数字之和为素数。文章详细解释了问题背景、输入输出格式及示例,并提供了一份Java实现代码,采用深度优先搜索算法求解所有符合条件的方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Prime Ring Problem

Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 60130    Accepted Submission(s): 25984


Problem Description
A ring is compose of n circles as shown in diagram. Put natural number 1, 2, ..., n into each circle separately, and the sum of numbers in two adjacent circles should be a prime.

Note: the number of first circle should always be 1.


 

Input
n (0 < n < 20).
 

Output
The output format is shown as sample below. Each row represents a series of circle numbers in the ring beginning from 1 clockwisely and anticlockwisely. The order of numbers must satisfy the above requirements. Print solutions in lexicographical order.

You are to write a program that completes above process.

Print a blank line after each case.
 

Sample Input
 
 
6 8
 

Sample Output
 
 
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
import java.util.Scanner;
public class P1016 {
	public static void DFS(int a[],int color[],int parent[],int u,int count){
		 count++;
		//递归鸿沟:当count达到n时,且a[u]+a[0]是素数
		 if(count==a.length&&isPrime(a[u]+a[0])){
			 parent[count-1]=a[u];
			 print(parent);
			 return;//返回
		 }
		 color[u]=1;//表示已经搜索--灰色
		 for(int v=0;v<a.length;v++){
			 if(color[v]==-1&&isPrime(a[u]+a[v])){
				//找到一个满足条件的节点,把它记录到parent
				 parent[count-1]=a[u];//记录父节点
				 DFS(a,color,parent,v,count);
				 
				 color[v]=-1;//把v还原成未搜索状态,以让后续路径能够尝试访问
			 }
		 }
	}
	public static void print(int parent[]){
		for(int i=0;i<parent.length;i++){
			if(i==parent.length-1){
				System.out.println(parent[i]);
			}else{
				System.out.print(parent[i]+" ");
			}
		}
	}
	public static boolean isPrime(int num){
		for(int i=2;i*i<=num;i++){
			if(num%i==0){
				return false;
			}
		}
		return true;
	}
	public static void main(String[] args) {
	   Scanner sc=new Scanner(System.in);
	   int number=0;//记录case的序号
	   while(sc.hasNext()){
		   int n=sc.nextInt();
		   //初始化图
		   int a[]=new int[n];//表示图中的n个节点,每个节点中存储一个自然数
		   int color[]=new int[n];
		   int parent[]=new int[n];
		   for(int i=0;i<a.length;i++){
			   a[i]=i+1;
			   color[i]=-1;
			   parent[i]=-1;
		   }
		   
		   System.out.println("Case "+(++number)+":");
		   
		   int count=0;//用来记录当前一次搜索进行到第几个数--递归进入的层数
		   DFS(a,color,parent,0,count);//深搜
		   System.out.println();
	   }

	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值