蓝桥杯无脑枚举三羊献瑞
【分析】
总共有8个不同的字,每个字都代表不同的数,那么我们很轻易就因该想到可以用一个boolean数组,用他的下标对应0-9,如果这个数字使用过我们就标记为true;在每个汉字对应的循环可能是0-9之前先进行判定用过这个数字没有,如果用过那么我们就结束本次循环ccontinue;
如果没有那么我们在使用这个数字的时候同样也要标记为true(使用过了),在进行下一个汉字对应的可能进行判断,依次类推到最后一个字,
1.这里可以用递归,然后回溯,回溯的目的就是本次数字组合已经用过,可以在对应的汉字下尝试下一个数字,尝试下一个数字之前,我们要先把本次已经用过的数字进行还原为可以用,false。
2,也可以傻不拉几的直接写,如我下面的代码一样,有很多代码用处是一样的,可以封装为一个函数进行递归调用。
public class dp12 {
public static void huisu(int i) {
mark[i] =false;//标记已经不能用了
//如果这个数字用了那么就结束这次循环,换下一个数字
}
static int[] a = new int[8];
static boolean[] mark = new boolean[10];
public static void main(String[] args) {
for (int i = 0; i <=9; i++) {
// System.out.println("i的值"+i);
mark[i] =true;//标记已经不能用了
for (int j = 0; j <=9 ; j++) {
if(mark[j]==true)continue;//如果这个数字用了那么就结束这次循环,换下一个数字
mark[j] =true;//标记已经不能用了
// System.out.print("j的值"+j+" ");
for (int j1 = 0; j1 <=9 ; j1++) {
if(mark[j1]==true)continue;//如果这个数字用了那么就结束这次循环,换下一个数字
mark[j1] =true;//标记已经不能用了
for (int j11 = 0; j11 <=9 ; j11++) {
if(mark[j11]==true)continue;//如果这个数字用了那么就结束这次循环,换下一个数字
mark[j11] =true;//标记已经不能用了
for (int j111 = 0; j111 <=9 ; j111++) {
if(mark[j111]==true)continue;//如果这个数字用了那么就结束这次循环,换下一个数字
mark[j111] =true;//标记已经不能用了
for (int j1111 = 0; j1111 <=9 ; j1111++) {
if(mark[j1111]==true)continue;//如果这个数字用了那么就结束这次循环,换下一个数字
mark[j1111] =true;//标记已经不能用了
for (int eight = 0; eight <=9 ; eight++) {
if(mark[eight]==true)continue;//如果这个数字用了那么就结束这次循环,换下一个数字
mark[eight] =true;//标记已经不能用了
for (int j12 = 0; j12 <=9 ; j12++) {
if(mark[j12]==true)continue;//如果这个数字用了那么就结束这次循环,换下一个数字
mark[j12] =true;//标记已经不能用了
a[0]=i;
a[1]=j;
a[2]=j1;
a[3] =j11;
a[4] = j111;
a[5]=j1111;
a[6]=j12;
a[7] = eight;
if(a[0] * 1000 + a[1] * 100 + a[2] * 10 + a[3] +
a[4] * 1000 + a[5] * 100 + a[6] * 10 + a[1]
== a[4] * 10000)
huisu(j12);
}huisu(eight);
}huisu(j1111);
}huisu(j111);
}huisu(j11);
}huisu(j1);
}huisu(j);
}huisu(i);
}
}
}