杭电1016Java实现

主环问题:
问题描述
如图所示,环由n个圆组成。将自然数1,2,…,n分别放入每个圆圈中,并且相邻两个圆圈中的数字总和应为素数。
注意:第一个圆圈的数量应该始终为1。
输入
n(0《n<20)。
输出
输出格式如下所示。每行代表从1开始顺时针和逆时针旋转的一系列圆圈数字。数字的顺序必须符合上述要求。按照字典顺序打印解决方案。

你要编写一个完成上述过程的程序。

在每个案例后打印一个空行。
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
思路:核心思路是使用dfs暴力破解,遍历所有能形成的可能性,然后输出满足条件的,优化的话可以考虑剪枝,还要用一些参数表示元素的个数和之前存储的元素,考虑的条件是元素和前一个元素的和是否为素数,如果到了最后一个数还要考虑第一个数。
代码如下:

import java.util.Scanner;
public class 杭电1016 {
    static boolean b[]=new boolean[21];//用于判断是否用过
    static int time=0;//层数
    public static void main(String[] args)
    {
      Scanner sc=new Scanner(System.in);
      int Case=1;//输入案例第几个
      while(sc.hasNext())
      {
          int m=sc.nextInt();//个数
          int a[]=new int[m];//存储元素
          a[0]=1;         
          System.out.println("Case " Case   ":");
          dfs(m,a); 
          System.out.println();
          //judgel(m);//判断素数
      }
    }
    private static boolean judgel(int m) {//如果为素数返回真
        for(int i=2;i<m;i  )
        {
            if(m%i==0) {return false;}
        }
        return true;                
    }
private static void dfs(int m, int[] a) {
    if(time==m-1) {for(int i=0;i<m;i   ) //知道长度满足,一定满足情况
    {if(i==m-1)System.out.print(a[i]);else System.out.print(a[i] " ");}System.out.println();}
    else
    for(int i=2;i<m 1;i  )
        {
        if(!b[i])
        {
            if(time==m-2)
            {
                b[i]=true;
                if(judgel(i a[time])&&judgel(i 1))
                {
                  a[  time]=i;
                  dfs(m,a);
                  time--;
                }
                b[i]=false;
            }
            else
            {
            b[i]=true;
            if(judgel(i a[time]))
            {
              a[  time]=i;
              dfs(m,a);
              time--;
            }
            b[i]=false;
          } 
        }
        }       
    }
}

新手小白,时间和复杂度都很高。。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序员bigsai

喝杯咖啡压压惊!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值