杭电1016Java实现

简介: 如图所示,环由n个圆组成。将自然数1,2,…,n分别放入每个圆圈中,并且相邻两个圆圈中的数字总和应为素数。

主环问题:



问题描述


如图所示,环由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;
          } 
        }
        }       
    }
}
目录
相关文章
|
8月前
|
Java
杭电 OJ 1010-1019 Java解法(未更新完毕)
杭电 OJ 1010-1019 Java解法(未更新完毕)
36 1
|
8月前
|
Java
杭电acm1201 18岁生日 Java解法 时间类
杭电acm1201 18岁生日 Java解法 时间类
39 0
|
8月前
|
算法 Java
杭电 OJ 1000-1009 Java解法
杭电 OJ 1000-1009 Java解法
33 0
|
8月前
|
Java
杭电acm2018 母牛的故事 Java解法 经典递归
杭电acm2018 母牛的故事 Java解法 经典递归
48 0
|
8月前
|
Java BI
杭电acm1013 Digital Roots 数字根 Java解法 高精度
杭电acm1013 Digital Roots 数字根 Java解法 高精度
40 0
|
Java
Java 实现汉字按照首字母分组排序
Java 实现汉字按照首字母分组排序
739 0
|
Java 数据安全/隐私保护
JAVA 实现上传图片添加水印(详细版)(上)
JAVA 实现上传图片添加水印(详细版)
1326 0
JAVA 实现上传图片添加水印(详细版)(上)
|
存储 Java
Java实现图书管理系统
本篇文章是对目前Java专栏已有内容的一个总结练习,希望各位小主们在学习完面向对象的知识后,可以阅览本篇文章后,自己也动手实现一个这样的demo来加深总结应用已经学到知识并进行巩固。
445 0
Java实现图书管理系统
|
数据可视化 Java
Java实现拼图小游戏(1)—— JFrame的认识及界面搭建
如果要在某一个界面里面添加功能的话,都在一个类中,会显得代码难以阅读,而且修改起来也会很困难,所以我们将游戏主界面、登录界面、以及注册界面都单独编成一个类,每一个类都继承JFrame父类,并且在类中创建方法来来实现页面
568 0
Java实现拼图小游戏(1)—— JFrame的认识及界面搭建
|
Java Windows Spring
java实现spring boot项目启动时,重启Windows进程
java实现spring boot项目启动时,重启Windows进程
522 0