`
zhangxiang390
  • 浏览: 215001 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

3388=24及24点游戏的穷举算法

阅读更多

偶尔看到一题:用3 3 8 8 四个数和加减乘除组合得出24,前提是用完这四个数,几年没好好思考了,偶算了半天没答案,就写了个穷举算法,呵呵,貌似结果只有一种啊,各位兄台还有其它答案么?

package my;

public class DigitalPuzzle {
	private float[] operands=new float[]{3.0f, 3.0f, 8.0f, 8.0f};
	private int[] operators=new int[]{0, 1, 2, 3};//0 1 2 3 stand for + - * /
	private float[][] allSeries=new float[4][4*4*4*4]; //四个操作数所有可能的组合
	private int[][] allOperats=new int[3][4*4*4]; //三个操作符所有可能的组合
	private int validSeriesSum=0; //有效的操作数组合个数
	
	// 穷举所有的操作数排列及操作符排列
	public void init(){
		int i,j,m,n;

		for(i=0;i<4;i++)
			for(j=0;j<4;j++)
				for(m=0;m<4;m++){
					allOperats[0][i*16+j*4+m]=operators[i];
					allOperats[1][i*16+j*4+m]=operators[j];
					allOperats[2][i*16+j*4+m]=operators[m];					
				}
		
		int kk=0;
		for(i=0;i<4;i++)
			for(j=0;j<4;j++)
				for(m=0;m<4;m++)
					for(n=0;n<4;n++)
						if(i!=j && i!=m && i!=n && j!=m && j!=n && m!=n){
							allSeries[0][kk]=operands[i];
							allSeries[1][kk]=operands[j];
							allSeries[2][kk]=operands[m];
							allSeries[3][kk]=operands[n];
							kk++;							
						}
		validSeriesSum=kk;
	}
	
	
	public float Calcu(float op1, float op2, int op){
		switch(op){
		case 0: return op1+op2;
		case 1: return op1-op2;
		case 2: return op1*op2;
		case 3: return op1/op2;
		default:
			return 0.0f;
		}
	}
	
	// 打印计算结果
	public String show(float op[], int opt[], int result){
		String[] opts=new String[opt.length];		
		for(int i=0;i<opt.length;i++)
			switch(opt[i]){
			case 0: opts[i]="+";break;
			case 1: opts[i]="-";break;
			case 2: opts[i]="*";break;
			case 3: opts[i]="/";break;
			default:
				opts[i]="wrong";
			}
		return op[3]+opts[2]+"("+op[2]+opts[1]+"("+op[1]+opts[0]+op[0]+")) = "+result;
	}
	
	// 穷举过程
	public void find(){		
		for(int i=0;i<validSeriesSum;i++)
			for(int j=0;j<4*4*4;j++){				
				float tmp1=Calcu(allSeries[1][i], allSeries[0][i],allOperats[0][j]);
				float tmp2=Calcu(allSeries[2][i], tmp1, allOperats[1][j]);
				float tmp3=Calcu(allSeries[3][i], tmp2, allOperats[2][j]);
				if(Math.abs(tmp3-24.0f)<0.01f)
					System.out.println(show(new float[]{allSeries[0][i],allSeries[1][i],
							allSeries[2][i],allSeries[3][i]},new int[]{allOperats[0][j],
							allOperats[1][j],allOperats[2][j]}, 24));
			}			
	}
	
	public static void main(String[] args){
		DigitalPuzzle dp=new DigitalPuzzle();
		dp.init();
		dp.find();
	}
}
 

打印结果: 8.0/(3.0-(8.0/3.0)) = 24

 

分享到:
评论

相关推荐

    24点算法实现

    给定4个整数,其中每个数字只能使用一次;任意使用 + - * / ( ) ,构造出一个表达式,使得最终结果为24,这就是常见的算24点的游戏。这方面的程序很多,一般都是穷举求解。本程序通过递归算法实现实现24点计算,

    24点算法,不正确你抽我

    24点算法,穷举12288种可能,不正确你抽我。

    24点游戏的c++算法实现

    给4个整数,只用加减乘除,得出所有能得到24的算法 //基本思想是用3个运算符和4个数的排列组合进行穷举 //为了实现循环,自定义了4个运算符,并放入函数数组中

    C语言算法1-3章 算法,递归算法 模拟算法

    1.4.枚举(穷举)算法.wmv 3.2.网状关系:图(2).wmv 3.2.网状关系:图(1).wmv 3.1.层次关系结构:树(3).wmv 3.1.层次关系结构:树(2).wmv 3.1.层次关系结构:树(1).wmv 2.3.后进先出结构:栈.wmv 2.1.最简单的结构:...

    24点游戏(带课程设计报告).zip

    24点游戏就是其中之一,其操作过程为随机产生的四个数,通过四则计算(每个数只能使用一次),使其结果为24.本游戏对培养人们的注意力、计算力...通过穷举法、递归函数两种算法,利用C#程序设计语言实现了24点游戏。

    Unity3D教程:游戏开发算法

    算法设计是一件非常困难的工作,经常采用的算法设计技术主要有迭代法、穷举搜索法、递推法、贪婪法、回溯法、分治法、动态规划法等等。另外,为了更简洁的形式设计和藐视算法,在算法设计时又常常采用递归技术,用...

    C语言实现经典24点算法

    本文实例为大家分享了C语言经典24点算法的具体实现代码,供大家参考,具体内容如下 1、概述  给定4个整数,其中每个数字只能使用一次;任意使用 + – * / ( ) ,构造出一个表达式,使得最终结果为24,这就是常见的...

    C#实现的24点游戏实例详解

    1. 24点游戏规则及算法 规则:给出4个自然数,找出能够求出24的四则运算式,要求数字不能重复使用 分析: 本算法是一种暴力求解法: 给出任意两个数字,可以进行6种四则运算,求出最多6个值。以数字a和b为例,有: ...

    数据结构与算法视频课程(59集)

    数据结构与算法视频课程(59集)资源目录:【】mysql视频教程第41讲存储过程【】数据结构与算法_1.10算法的评价【】数据结构与算法_1.1编程的灵魂:数据结构 算法【】数据结构与算法_1.2算法的作用:猜价格游戏【】...

    Java常用算法手册源代码

    3.2.1 穷举算法基本思想 3.2.2 穷举算法实例 3.3 递推算法思想 3.3.1 递推算法基本思想 3.3.2 递推算法实例 3.4 递归算法思想 …… 第2篇 算法应用篇 第4章 排序算法 第5章 查找算法 第6章 基本数学问题 第7章 数据...

    C/C++常用算法手册.秦姣华(有详细书签).rar

    《C/C++常用算法手册》对每一个知识点都给出了相应的算法及应用示例。虽然这些例子都是以C语言来编写的,但是算法并不局限于C语言。如果读者采用其他编程语言,例如C++、C#、VB、Java等,根据其语法格式进行适当的...

    旅行者问题+商品选取问题(算法分析与设计:穷举法(C++,含可执行源码+完整算法分析))

    题目 2:某大型商场举办了一个游戏,为了吸引大家参与该游戏,商场对游戏的获胜者进行了奖励:游戏的获胜者可以使用商场提供的小汽车到商场中任意选取其中的商品,但要求每种商品最多只能取一个,不能多取。...

    AI-Project_Cryptarithmetic_Alphametics:“使用回溯算法和蛮力搜索(穷举搜索)算法的密码学难题”

    AI-Project_Cryptarithmetic_-Alphametics- “使用回溯算法和蛮力搜索(穷举搜索)算法的密码学难题”密码学,也称为字母算术,是一种数学游戏(或难题),由未知数之间的数学方程组成,其数字用字母表示的字母。...

    基于挖洞思想的数独游戏生成算法

    基于挖洞思想的数独游戏生成算法, 摘要: 设计一个算法用以生成各种难度等级的数独题,通过对游戏规则的分析,首先从以下三个方面定 义难度等级:已知格总数、已知格的分布和穷举搜索复杂度.本算法采用“挖洞”...

    算法设计和分析题目和源代码.doc

    24. 用随机投点法求圆周率PI 68 25. 活动安排 69 26. 数独游戏 71 27. 装盘子 77 28. 子集 78 29. 最长公共子序列 80 30. 防卫导弹 81 31. 田忌赛马 84 32. 计算矩阵连乘积 86 33. 石子合并 88 34. 旅游预算 90 35. ...

    11_基于_挖洞_思想的数独游戏生成算法1

    摘要:设计一个算法用以生成各种难度等级的数独题,通过对游戏规则的分析,首先从以下三个方面定义难度等级:已知格总数、已知格的分布和穷举搜索复杂度.本算法采用“ 挖

    24dian.zip_24点_searchwg1_小游戏

    VS2015可用,可进行计算24点的解:即输入四个数,输出如何得到经过加减乘除得到24,和网上大多数不同,网上大部分是穷举,有很多是一样的,比如9+9+9-3和9-3+9+9都会输出,而我这个过滤了重复的,一般只得到几种算法,...

    算法概论.pdf

    9.1Intelligentexhaustivesearch(智能穷举搜索) 9.2Approximationalgorithms(近似算法) 9.3Localsearchheuristics(局部启发式搜索) Exercises(习题) 10Quantumalgorithms(量子算法) 10.1Qubits,...

    开心连连看6.0(win32)

    连连看是一款经典的益智游戏,主要寻路算法为穷举算法,网上随处可见。 本游戏也是连连看游戏,作者给其取名为开心连连看,主要寻路算法由作者完全自主创新设计,跟传统的穷举寻路算法有很巨大的区别,因为这个算法...

    基于穷举搜索的AI自动实现俄罗斯方块游戏

    tetris_ai.py是AI实现算法部分部分。 自己玩的规则:游戏板面是一个矩形网格,您需要使用方向键和空格键来控制方块的移动和旋转。 使用向上键:旋转当前形状,使其适应不同的空间布局。 使用向左键:将当前形状向左...

Global site tag (gtag.js) - Google Analytics