蓝桥杯无脑枚举三羊献瑞

蓝桥杯无脑枚举三羊献瑞

在这里插入图片描述【分析】

总共有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);
			}
		}
	}
	
	



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值