题目
题目描述:
小明被绑架到X星球的巫师W那里。
其时,W正在玩弄两组数据 (2 3 5 8) 和 (1 4 6 7)他命令小明从一组数据中分别取数与另一组中的数配对,共配成4对(组中的每个数必被用到)。小明的配法是:{(8,7),(5,6),(3,4),(2,1)}
巫师凝视片刻,突然说这个配法太棒了!
因为:每个配对中的数字组成两位数,求平方和,无论正倒,居然相等:87^2 + 56^2 + 34^2 + 21^2 = 1230278^2 + 65^2 + 43^2 + 12^2 = 12302
小明想了想说:“这有什么奇怪呢,我们地球人都知道,随便配配也可以啊!”{(8,6),(5,4),(3,1),(2,7)}
86^2 + 54^2 + 31^2 + 27^2 = 1200268^2 + 45^2 + 13^2 + 72^2 = 12002
巫师顿时凌乱了。。。。。
请你计算一下,包括上边给出的两种配法,巫师的两组数据一共有多少种配对方案具有该特征。配对方案计数时,不考虑配对的出现次序。就是说:{(8,7),(5,6),(3,4),(2,1)}与{(5,6),(8,7),(3,4),(2,1)}是同一种方案。
输入:
输出:
样例输入
样例输出
无
思路
DFS
代码
public class Main {
static int num = 0;
static boolean vis[] = {false,false,false,false};
static int a[] = {2,3,5,8},b[] = {1,4,6,7};
public static void dfs(int[][]r,int x) {
if(x>=4) {
int sum1=0,sum2=0;
for(int i=0;i<4;i++) {
sum1+=r[i][0]*r[i][0];
sum2+=r[i][1]*r[i][1];
}
if(sum1==sum2) {
num++;
}
return;
}
for(int i=0;i<4;i++) {
for(int j=0;j<4;j++) {
if(!vis[i]) {
r[i][0]=a[i]*10+b[j];
r[i][1]=a[i]+10*b[i];
vis[i]=true;
dfs(r,x+1);
vis[i]=false;
}
}
}
}
public static void main(String[] args) {
int[][] r=new int[4][2];
dfs(r,0);
System.out.println(num);
}
}