杭电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;
          } 
        }
        }       
    }
}
目录
相关文章
|
Java
Java 实现汉字按照首字母分组排序
Java 实现汉字按照首字母分组排序
574 0
|
分布式计算 Java Hadoop
Java实现单词计数MapReduce
本文分享实现单词计数MapReduce的方法
307 0
|
Java 数据安全/隐私保护
JAVA 实现上传图片添加水印(详细版)(上)
JAVA 实现上传图片添加水印(详细版)
982 0
JAVA 实现上传图片添加水印(详细版)(上)
|
存储 Java
Java实现图书管理系统
本篇文章是对目前Java专栏已有内容的一个总结练习,希望各位小主们在学习完面向对象的知识后,可以阅览本篇文章后,自己也动手实现一个这样的demo来加深总结应用已经学到知识并进行巩固。
377 0
Java实现图书管理系统
|
Java Windows Spring
java实现spring boot项目启动时,重启Windows进程
java实现spring boot项目启动时,重启Windows进程
476 0
|
数据可视化 Java
Java实现拼图小游戏(1)—— JFrame的认识及界面搭建
如果要在某一个界面里面添加功能的话,都在一个类中,会显得代码难以阅读,而且修改起来也会很困难,所以我们将游戏主界面、登录界面、以及注册界面都单独编成一个类,每一个类都继承JFrame父类,并且在类中创建方法来来实现页面
464 0
Java实现拼图小游戏(1)—— JFrame的认识及界面搭建
|
网络协议 Java
Java网络编程:UDP/TCP实现实时聊天、上传图片、下载资源等
ip地址的分类: 1、ipv4、ipv6 127.0.0.1:4个字节组成,0-255,42亿;30亿都在北美,亚洲就只有4亿 2011年就用尽了。
Java网络编程:UDP/TCP实现实时聊天、上传图片、下载资源等
|
数据可视化 Java 容器
Java实现拼图小游戏(7)—— 计步功能及菜单业务的实现
注意由于我们计步功能的步数要在重写方法中用到,所以不能将初始化语句写在方法体内,而是要写在成员位置。在其名字的时候也要做到“见名知意”,所以我们给它起名字为step
273 0
Java实现拼图小游戏(7)—— 计步功能及菜单业务的实现
|
Java
Java实现拼图小游戏(7)—— 作弊码和判断胜利
当我们好不容易把拼图复原了,但是一点提示也没有,完全看不出来是成功了,那么我们就需要有判断胜利的功能去弹出“成功”类的图片,以便于玩家选择是重新开始还是退出小游戏
243 0
Java实现拼图小游戏(7)—— 作弊码和判断胜利
|
Java
Java实现拼图小游戏(7)——查看完整图片(键盘监听实例2)
由于在移动和图片中我们已经添加了键盘监听,也继承了键盘监听的接口,那么我们只需要在重写方法内输入我们的代码即可
178 0