蓝桥 凑平方数
Posted lemon1234
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了蓝桥 凑平方数相关的知识,希望对你有一定的参考价值。
/* 凑平方数 把0~9这10个数字,分成多个组,每个组恰好是一个平方数,这是能够办到的。 比如:0, 36, 5948721 再比如: 1098524736 1, 25, 6390784 0, 4, 289, 15376 等等... 注意,0可以作为独立的数字,但不能作为多位数字的开始。 分组时,必须用完所有的数字,不能重复,不能遗漏。 如果不计较小组内数据的先后顺序,请问有多少种不同的分组方案? 注意:需要提交的是一个整数,不要填写多余内容。 */
题解 :完全排列+DFS+Set(查重)
import java.util.*; public class Main{ static int[] num = {0,1,2,3,4,5,6,7,8,9}; static long[] record = new long[15]; static Set<String> set = new HashSet<String>(); static boolean judge(long number) { if(Math.sqrt(number)==(long)Math.sqrt(number)) return true; else return false; } static String getString(int cnt) { long[] temp = new long[15]; for(int i=0;i<cnt;i++) temp[i] = record[i]; Arrays.sort(temp, 0,cnt); String string = ""; for(int i=0;i<cnt;i++) { string += temp[i]; string += ","; } return string; } static void dfs(int index,int cnt) { if(index==10) { // if(!set.contains(getString(cnt))) // System.out.println(getString(cnt)); set.add(getString(cnt)); return; } if(num[index]==0) { record[cnt] = 0; dfs(index+1, cnt+1); return; } long number = 0; for(int i=index;i<10;i++) { number = number*10+num[i]; if(judge(number)) { record[cnt] = number; dfs(i+1, cnt+1); } } } static void permutation(int step) { if(step==10) { dfs(0,0); return; } for(int i=step;i<10;i++) { int temp = num[step]; num[step] = num[i]; num[i] = temp; permutation(step+1); temp = num[step]; num[step] = num[i]; num[i] = temp; } } public static void main(String[] args) { Scanner scanner = new Scanner(System.in); permutation(0); System.out.println(set.size()); } }
import java.util.*; public class Main{ static int[] num = {0,1,2,3,4,5,6,7,8,9}; static Set<String> set = new HashSet<String>(); static List<Long> list; static boolean judge(long number) { if(Math.sqrt(number)==(long)Math.sqrt(number)) return true; else return false; } static String getString() { Set<Long> treeSet = new TreeSet<Long>(); for(Long e:list) treeSet.add(e); String string = ""; for(Long e:treeSet) { string += e; string += ","; } return string; } static void dfs(int step) { if(step==10) { // if(!set.contains(getString())) { // for(int i=0;i<10;i++) // System.out.print(num[i]+" "); // System.out.println(); // System.out.println(getString()); // System.out.println(); // // } set.add(getString()); return; } if(num[step]==0) { list.add((long) num[step]); dfs(step+1); list.remove(list.size()-1); return; } long number = 0; for(int i=step;i<10;i++) { number = number*10 + num[i]; if(judge(number)) { list.add(number); dfs(i+1); list.remove(list.size()-1); } } } static void permutation(int step) { if(step==10) { list = new ArrayList<Long>(); dfs(0); return; } for(int i=step;i<10;i++) { int temp = num[step]; num[step] = num[i]; num[i] = temp; permutation(step+1); temp = num[step]; num[step] = num[i]; num[i] = temp; } } public static void main(String[] args) { Scanner scanner = new Scanner(System.in); permutation(0); System.out.println(set.size()); } }
以上是关于蓝桥 凑平方数的主要内容,如果未能解决你的问题,请参考以下文章
蓝桥杯每日一真题—— [蓝桥杯 2021 省 AB2] 完全平方数(数论,质因数分解)