资源限制

时间限制:3.0s   内存限制:256.0MB

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


题目大意:

将n个数围成一圈,使得任意相邻两数的和都是质数,注意每个圆环的开头都是1,并输出满足情况的所有解。

解题思路:

最核心的问题是输出每种情况的所有序列,可以深度搜索,从第二个圆盘到最后一个圆盘,要判断相邻的和是否为素数,而用到素数,可以提前先用一个数组将素数标志出来,当判断到最后一个圆盘时,还需要将第一个圆盘考虑进去。满足情况的解输出即可。

需要注意的是:程序在输入时,并没有提前指出要输入几次,所以需要用while()循环作判断,Scanner类中的hasNexyInt()方法可以判断下一个读取的是否为数字。或者用hasNextLine()加nextLine()读取到字符串,再判断该字符串是否为空。

java代码:

import java.util.*;public class Main {public static void main(String[] args) {Scanner scan = new Scanner(System.in);int count = 0;while(scan.hasNextInt()) {int n = scan.nextInt();count++;System.out.printf("Case %d:\n",count);Temp977 obj = new Temp977(n);obj.dfs(1);System.out.println();}scan.close();}
}
class Temp977{int n;boolean []vis;//标志数组boolean []prime = new boolean[41];//打表,存储40以内的素数List<Integer> list = new ArrayList<>();//存放实时“数据链”public Temp977(int n) {this.n = n;vis = new boolean[n + 1];isPrime();//打表}public void dfs(int step) {//表示第几个“圆盘”if(step > n) {//已经摆放完圆盘for(int i = 0; i < list.size() - 1; i++) {System.out.print(list.get(i) + " ");}System.out.println(list.get(list.size() - 1));return;}for(int i = 1; i <= n; i++) {if(step == 1) {list.add(i);vis[i] = true;dfs(step + 1);}else{if(!vis[i]) {//还没有放过if(step != n) {//不是最后一个圆盘int sum = list.get(step - 2) + i;//计算相邻两圆盘数值和,减2是因为数组下标从0开始if(!prime[sum])continue;//不是素数则放下一个数}else {//是最后一个圆盘则还需考虑最后一个和第一个的和int sum1 = list.get(step - 2) + i;int sum2 = list.get(0) + i;if(!prime[sum1] || !prime[sum2])continue;}list.add(i);//符合条件则加入listvis[i] = true;//标志为已访问dfs(step + 1);//搜索下一个位置list.remove(list.size() - 1);//回溯vis[i] = false;}}}}public void isPrime() {//打表求素数for(int i = 2; i <= 40; i++) {int j;for(j = 2; j <= (int)Math.sqrt(i); j++) {if(i % j == 0) {break;}}if(j == (int)Math.sqrt(i) + 1) {prime[i] = true;}}}
}

提交截图:

算法提高 素数环 java 题解 977相关推荐

  1. 试题 算法提高 密室逃脱 Java题解

    问题描述 真人版密室逃脱游戏风靡全球,不仅在麻瓜世界广受欢迎,而且在魔法世界也十分流行.考虑到魔法世界的人们会使用能够瞬间移动的魔法,密室逃脱游戏在被引进魔法世界时作了一些修改:"密室迷宫& ...

  2. 试题 算法提高 密室逃脱 java 题解 1183

    问题描述 真人版密室逃脱游戏风靡全球,不仅在麻瓜世界广受欢迎,而且在魔法世界也十分流行.考虑到魔法世界的人们会使用能够瞬间移动的魔法,密室逃脱游戏在被引进魔法世界时作了一些修改:"密室迷宫& ...

  3. java 蓝桥杯算法提高 字符串匹配(题解)

    试题 算法提高 字符串匹配 资源限制 时间限制:1.0s 内存限制:256.0MB 问题描述 给出一个字符串和多行文字,在这些文字中找到字符串出现的那些行.你的程序还需支持大小写敏感选项:当选项打开时 ...

  4. 算法笔记_163:算法提高 最大乘积(Java)

    目录 1 问题描述 2 解决方案   1 问题描述 问题描述 对于n个数,从中取出m个数,如何取使得这m个数的乘积最大呢? 输入格式 第一行一个数表示数据组数 每组输入数据共2行: 第1行给出总共的数 ...

  5. 算法提高 超级玛丽(java)

    算法提高 超级玛丽 文章转载于zhangyaoya 描述 大家都知道"超级玛丽"是一个很善于跳跃的探险家,他的拿手好戏是跳跃,但它一次只能向前跳一步或两步.有一次,他要经过一条长为 ...

  6. 算法提高 高精度乘法(java)

    算法提高 高精度乘法 描述 在C/C++语言中,整型所能表示的范围一般为-231到231(大约21亿),即使long long型,一般也只能表示到-263到263.要想计算更加规模的数,就要用软件来扩 ...

  7. 算法笔记_167:算法提高 矩阵翻转(Java)

    目录 1 问题描述 2 解决方案   1 问题描述 问题描述 Ciel有一个N*N的矩阵,每个格子里都有一个整数. N是一个奇数,设X = (N+1)/2.Ciel每次都可以做这样的一次操作:他从矩阵 ...

  8. 蓝桥杯 算法提高 转圈游戏 JAVA

    蓝桥杯 转圈游戏 原题描述 解题思路 JAVA代码 运行结果 原题描述 问题描述 n 个小伙伴(编号从 0 到 n-1)围坐一圈玩游戏.按照顺时针方向给 n 个位置编号,从0 到 n-1.最初,第 0 ...

  9. 蓝桥杯 ADV-205 算法提高 拿糖果 java版

    问题描述 妈妈给小B买了N块糖!但是她不允许小B直接吃掉. 假设当前有M块糖,小B每次可以拿P块糖,其中P是M的一个不大于根号下M的质因数.这时,妈妈就会在小B拿了P块糖以后再从糖堆里拿走P块糖.然后 ...

最新文章

  1. python 验证码识别示例(二) 复杂验证码识别
  2. c++网络通信(与服务器通信聊天)和c#网络通信
  3. String SringBuffer StringBuilder区别
  4. qt中关闭窗口资源释放问题
  5. K8S集群的搭建:环境准备及相关命令
  6. xgboost安装_Machine Learning Mastery 博客文章翻译:XGBoost
  7. cardsui-for-android
  8. 最后关于Pipeline完整的图如下:
  9. Qt工作笔记-使用Qt Creator运行和调试运行结果不一样(参数没有初始化)
  10. python atm详解_python基础之ATM-1
  11. kafka_2.12-3.2.0安装包快速下载地址分享
  12. 各浏览器驱动webdriver下载
  13. 如何使用电脑将png转ico格式?赶快跟着小编学起来
  14. 期货交易结算信息(期货结算系统)
  15. matlab归一程序,Matlab三种归一化方法
  16. 电容实际等效模型(容抗、感抗、品质因数Q)
  17. 脚踏实地《数据结构第二章》第五节:循环链表
  18. C# Winform窗体置顶(解决this.this.TopMost = true失效的问题)
  19. Pandas: 交叉表(crosstab)和透视表(pivot_table)的用法
  20. 斯坦福机器人学导论(视频+英文PPT讲义+课程作业+英文书籍)

热门文章

  1. 《啤酒与尿布》之读感
  2. [Swust OJ 643]--行列式的计算(上三角行列式变换)
  3. 2012中国互联网公司、全球互联网公司最新市值排名(2012.12.06)
  4. linux执行可执行命令程序ls,linux运行可执行程序命令
  5. 用python构建多只股票日收益率直方图_Barra纯因子收益率的Python实现
  6. IDEA运行卡顿,网页刷新不及时,网页报404错误以及Ajax收不到servlet返回的数据(已解决)
  7. 崩坏三8月20号服务器维修,崩坏3手游8月20日更新了什么
  8. 节假日判断工具(Java)
  9. jsp:使用request为页面添加静态数据。
  10. java中使用Calendar日期类获得下一个月有多少天