枚举算法

枚举(穷举)法

枚举法的本质就是从所有候选答案中去搜索正确的解,使用该算法需要满足两个条件:

(1):可预先确定候选答案的数量;

(2):候选答案的范围在求解之前必须有一个确定的集合.

实例1:填数游戏.



 

 Java代码描述:

public static void main(String[] args) {

		int multi = 1;
		int result = 0;
		int i1, i2, i3, i4, i5;
		for (i1 = 1; i1 <= 9; i1++) { 
			for (i2 = 0; i2 <= 9; i2++) {
				for (i3 = 0; i3 <= 9; i3++) {
					for (i4 = 0; i4 <= 9; i4++) {
						for (i5 = 0; i5 <= 9; i5++) {
							multi = i1 * 10000 + i2 * 1000 + i3 * 100 + i4 * 10 + i5;
							result = i5 * 100000 + i5 * 10000 + i5 * 1000 + i5 * 100 + i5 * 10 + i5;
							if (multi * i1 == result) {
								System.out.println(i1 + " " + i2 + " " + i3 + " " + i4 + " " + i5);
								System.out.println("        " + i1);
								System.out.println("-----------------");
								System.out.println(i5 + " " + i5 + " " + i5 + " " + i5 + " " + i5);
								break;
							}
						}
					}
				}
			}
		}

	}

 运行结果:


 

实例2:填运算符:



 


Java代码描述:

	private static void tysf() {
		int[] i = new int[5];// 数组i用来表示4个运算符
		int j; // 循环变量
		int sign; // 累加运算时的符号
		int result = 0; // 保存运算式的结果值
		int count = 0; // 计数器,统计符合条件的方案
		int[] num = new int[6]; // 保存操作数
		float left, right; // 保存中间结果
		char[] oper = { ' ', '+', '-', '*', '/' }; // 运算符
		System.out.println("请输入五个数");
		Scanner sc = new Scanner(System.in);
		for (int ii = 1; ii < num.length; ii++) {
			num[ii] = sc.nextInt();
		}
		System.out.println("请输入结果");
		result = sc.nextInt();
		// for (i[0] = 1; i[0] < 4; i[0]++) { //循环4中填运算符,1表示+,2表示-,3表示*,4表示/
		// if ((i[0] < 4) || (num[1] != 0)) { //运算符如果是/,则第二个运算数不能为0
		for (i[1] = 1; i[1] <= 4; i[1]++) {
			if ((i[1] < 4) || (num[2] != 0)) {
				for (i[2] = 1; i[2] <= 4; i[2]++) {
					if ((i[2] < 4) || (num[3] != 0)) {
						for (i[3] = 1; i[3] <= 4; i[3]++) {
							if ((i[3] < 4) || (num[4] != 0)) {
								for (i[4] = 1; i[4] <= 4; i[4]++) {
									if ((i[4] < 4) || (num[5] != 0)) {
										left = 0;
										right = num[1];
										sign = 1;
										for (j = 1; j <= 4; j++) {
											switch (oper[i[j]]) {
											case '+':
												left = left + sign * right;
												sign = 1;
												right = num[j + 1];
												break;
											case '-':
												left = left + sign * right;
												sign = -1; // 通过sign=-1实现减法
												right = num[j + 1];
												break;
											case '*':
												right = right * num[j + 1]; // 实现乘法
												break;
											case '/':
												right = right / num[j + 1]; // 实现除法
												break;
											}
										}
										if (left + sign * right == result) {
											count++;
											System.out.print(count + "  ");
											for (j = 1; j <= 4; j++) {
												System.out.print(num[j] + "" + oper[i[j]]);
											}
											System.out.println("=" + result);
										}
									}
								}
							}
						}
					}
				}
			}
		}
		if (count == 0) {
			System.out.println("没有符合条件的 ");
		}
	}

 运行结果:

 

猜你喜欢

转载自bbllmyd.iteye.com/blog/2301553
今日推荐