题目:
思路:先全排列,在对排列后的数据进行深搜,通过使每一组数据都为升序达到去重的目的
AC代码:
package 蓝桥杯2016;
import java.util.*;
public class 凑平方数 {
static int a[]= {1,2,3,4,5,6,7,8,9,0};
static int ans=0;
static Set<Long>set=new HashSet<>();
public static void main(String[] args) {
for(long i=0;i<=100000;i++) {
set.add(i*i);
}
show(0);
System.out.println(ans);
}
private static void show(int n) {//全排列
if(n==a.length) {
dfs(-1,0);
}
for(int i=n;i<a.length;i++) {
{int temp=a[i];a[i]=a[n];a[n]=temp;}
show(n+1);
{int temp=a[i];a[i]=a[n];a[n]=temp;}
}
}
private static void dfs(long ss, int x) {//ss为上一个数,通过判断下一个数是否大于上一个数据来去重
if(x==10) {
//System.out.println(ans);
ans++;
return;
}
if(a[x]==0) {
if(x==0)dfs(0,x+1);
return;
}
long sum=0;
for(int i=x;i<10;i++) {
sum=sum*10+a[i];
if(sum>ss&&set.contains(sum))dfs(sum,i+1);
}
}
}