`
qdzheng
  • 浏览: 67746 次
  • 性别: Icon_minigender_1
  • 来自: 济南
社区版块
存档分类
最新评论

趣味编程:24点算法实现

    博客分类:
  • Java
阅读更多
24点游戏规则:任取1-9之间的4个数字,用+-*/()连结成算式,使得式子的计算结果为24。估计很多人都玩过用扑克牌玩的那种,印象中10也算在内的,两人各出2张牌,谁先算出来谁赢,赢家收回已经算过的4张牌。最后看谁手里的牌多。
这个程序实现使用穷举的方法,将所有可能的排列穷举出来,最后将每个排列中计算出结果。计算结果时,将前两个作为一组、后两个数作为一组,分别计算出各组的结果,再对获得的两个组结果进行计算。由于是排列,分前后两组进行计算就可满足所有可能的计算。

改进后的代码见回复中。

package fun.twentyfour;

import java.io.BufferedReader;
import java.io.InputStreamReader;

public class TwentyFour {
	public static void main(String[] args){
		BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
		String line;
		try{
			while((line=br.readLine())!=null){
				try{
					if ("exit".equals(line)) break;
					
					String[] s=line.split("\\s");
					int[] v=new int[4];
					for(int idx=0;idx<4;idx++) {
						v[idx]=Integer.parseInt(s[idx]);
						if (v[idx]<=0||v[idx]>=10) throw new Exception("Input error.");
					}
					evaluate(v);
					
				}catch(Exception ex){
					ex.printStackTrace();
				}
			}
		}catch(Exception ex){
			ex.printStackTrace();
		}
	}
	
	public static void evaluate(int[] v){
		int idx=0;
		for(int a=0;a<4;a++)
			for(int b=0;b<4;b++)
				for (int c=0;c<4;c++)
					for (int d=0;d<4;d++){
					if (a!=b && a!=c && a!=d && b!=c && b!=d && c!=d){
						idx++;
						check(v,new int[]{a,b,c,d});
					}
				}
	}
	static char[] op={'+','-','*','/'};
	public static void check(int[] v,int[] idx){
		
		for(int o=0;o<4;o++){
			for(int p=0;p<4;p++){
				for(int t=0;t<4;t++){
					if (op(op[p],op(op[o],v[idx[0]],v[idx[1]]),op(op[t],v[idx[2]],v[idx[3]]))==24){
						System.out.println(String.format("(%1$d %2$c %3$d) %4$c (%5$d %6$c %7$d)",
								v[idx[0]],op[o],v[idx[1]],op[p],v[idx[2]],op[t],v[idx[3]]));
					}
				}
			}
		}
	}

	public static int op(char op,int v1,int v2){
		switch(op){
		case '+':
			return v1+v2;
		case '-':
			return v1-v2;
		case '*':
			return v1*v2;
		case '/':
			if (v2==0) return -111;
			if (v1%v2!=0) return -111;
			return v1/v2;
		default:
				return 0;
		}
	}
}
分享到:
评论
5 楼 zeeeitch 2009-01-09  
偶以前写的,c++。翻出来共享一下。好像也是穷举啊,考虑了()×()了

#pragma once

#include "iostream"
#include<vector>
using namespace std;  

//排列生成器
//给一串数,返回各种排列
template <class T>
class ArrangeGenerator
{
public:
	ArrangeGenerator(const vector<T> & av) : current_(0)
	{
		Arranges(av, Result_);
	}

	bool haveNext()
	{
		return Result_.size() != current_;
	}

	vector<T> next()
	{
		return Result_[current_++];
	}

private:
	vector<vector<T> > Result_;
	int current_;

	void Arranges(const vector<T>& Source, vector<vector<T> >& Result)
	{
		vector<T> temp;
		vector<vector<T> > temp2;

		typedef vector<T>::const_iterator vi;
		typedef vector<vector<T> >::iterator vvi;


		Result.clear();
		if (Source.size() == 2)
		{
			temp.push_back(Source[0]);
			temp.push_back(Source[1]);
			Result.push_back(temp);

			temp.clear();
			temp.push_back(Source[1]);
			temp.push_back(Source[0]);
			Result.push_back(temp);
		}
		else
		{
			for (vi i = Source.begin(); i != Source.end(); ++i)
			{
				vector<T> temp(Source.size() - 1);

				copy(Source.begin(), i, temp.begin());
				copy(i + 1, Source.end(), temp.begin() + (i - Source.begin()));

				//递归
				Arranges(temp, temp2);

				for (vvi j = temp2.begin(); j != temp2.end(); ++j)
				{
					vector<T> temp3(Source.size());
					temp3[0] = *i;
					copy(j->begin(), j->end(), temp3.begin() + 1);
					Result.push_back(temp3);
				}
			}
		}
	}

};

class OpBase
{
public:
	virtual int operator()(int a, int b) = 0;
	virtual void out(ostream& o) = 0;
};

ostream& operator<<(ostream& o, OpBase& ob);

class Plus : public OpBase
{
public:
	virtual int operator()(int a, int b);
	virtual void out(ostream& o);
};

class Minus : public OpBase
{
public:
	virtual int operator()(int a, int b);
	virtual void out(ostream& o);
};
class Minus2 : public OpBase
{
public:
	virtual int operator()(int a, int b);
	virtual void out(ostream& o);
};

class Multi : public OpBase
{
public:
	virtual int operator()(int a, int b);
	virtual void out(ostream& o);
};

class Devide : public OpBase
{
public:
	virtual int operator()(int a, int b);
	virtual void out(ostream& o);
};
class Devide2 : public OpBase
{
public:
	virtual int operator()(int a, int b);
	virtual void out(ostream& o);
};


namespace removeMulti
{
struct rmAux
{
	int num1;
	int num2;
	int res;
};
bool operator <(const rmAux& a,const rmAux& b)
{
	return (a.num1 < b.num1) || (a.num1 >= b.num1 && a.num2 < b.num2);
}
}
4 楼 zeeeitch 2009-01-09  
穷举法,能否优化一下?
3 楼 qdzheng 2009-01-09  
plisking 写道
我有一点不太明白,题目的条件是“任取1-9之间的4个数字,用+-*/()连结成算式”,为什么楼主要把数字分成两组??这不就改了条件吗?而且这样一来,运算的优先级以及最终算式的格式就被固定下来了,难度也就大幅降低了。但是会有算式被漏算掉的情况。
比如取四个数为:3 6 1 9,你的程序结果:
(3 - 6) * (1 - 9)
(6 - 3) * (9 - 1)
(1 - 9) * (3 - 6)
(9 - 1) * (6 - 3)
但是很显然,3*(6-1)+9这个合法的组合就不在其中。

你说得正确,这个算法是有问题的。回头改正。
2 楼 plisking 2009-01-09  
我有一点不太明白,题目的条件是“任取1-9之间的4个数字,用+-*/()连结成算式”,为什么楼主要把数字分成两组??这不就改了条件吗?而且这样一来,运算的优先级以及最终算式的格式就被固定下来了,难度也就大幅降低了。但是会有算式被漏算掉的情况。
比如取四个数为:3 6 1 9,你的程序结果:
(3 - 6) * (1 - 9)
(6 - 3) * (9 - 1)
(1 - 9) * (3 - 6)
(9 - 1) * (6 - 3)
但是很显然,3*(6-1)+9这个合法的组合就不在其中。
1 楼 xypro 2009-01-09  
如果保证算术符号只用一次 算法就会麻烦很多了

相关推荐

    小学生C++趣味编程配套教学资源

    以知识点为中心,《小学生C++趣味编程》适D地弱化语法,注重算法。利用流程图厘清思路,激发学习兴趣,培养计算思维。 本资源为官方正版配套教学资源,包含: 1)全书涉及的所有源代码(包含完整代码和不完整代码[即...

    python趣味编程100例(99个)

    "Python趣味编程100例(99个)"这个资源显然是为了帮助初学者通过一系列有趣的实践例子来学习Python编程。 在Python编程中,基础是非常重要的。例如,了解变量的声明和使用,数据类型如整型(int)、浮点型(float)、...

    青少年趣味编程Python系列课程--2019-09-23.pdf

    标题《青少年趣味编程Python系列课程--2019-09-23》以及描述《青少年趣味编程Python系列课程--2019-09-23》揭示了该文件是一份针对青少年的Python编程课程计划,时间为2019年9月23日。文档的标签为“python学习 系列...

    《Scratch趣味编程》.pdf

    《Scratch趣味编程》 《Scratch趣味编程》是一种图形化的编程语言,由美国麻省理工学院研发,可以轻松地创建自己互动故事、动画、游戏、音乐和艺术。 Scratch将程序语言设计成一块块积木,你只要用拖拉的方式,将...

    c++趣味编程配套课件

    C++趣味编程是一门引人入胜的课程,旨在帮助初学者理解编程基础,并通过实践探索编程的乐趣。在这个配套课件中,我们将深入探讨C++语言的各个方面,使其成为掌握编程概念的有效工具。 首先,我们要了解C++的基本...

    趣味矩阵算法实现源代码

    标题中的“趣味矩阵算法实现源代码”意味着我们将探讨一种用编程语言实现的,能够打印或操作特定模式矩阵的方法。这可能包括递归、循环或其他控制结构,以按照预设的规则填充和展示矩阵。 描述中的“算法分析与设计...

    小学生C++趣味编程 C++源代码(2021.11.22).rar

    标题中的“小学生C++趣味编程 C++源代码(2021.11.22).rar”表明这是一个专为小学生设计的C++编程学习资源包,包含了2021年11月22日更新的源代码。这个资源旨在以有趣的方式介绍C++编程基础,帮助孩子们在早期阶段...

    24点游戏的算法及实现

    24点游戏是一种深受人们喜爱的智力挑战游戏,它的...总的来说,24点游戏的算法实现是一个涉及排列组合、数学运算和递归编程的有趣课题。通过学习和实践,我们可以不仅提高编程技巧,还能增强逻辑推理和问题解决能力。

    《小学生C++趣味编程》-C++、Scratch(2023.09.24)C.pdf

    《小学生C++趣味编程》是一本面向初学者,特别是小学生的教材,旨在通过结合C++编程语言和Scratch可视化编程工具,激发孩子们对编程的兴趣。该书内容涵盖基础的编程概念,逐步引导学生掌握编程思维和技能。以下是书...

    python算法趣味题目

    ### Python算法趣味题目详解 #### 题目背景与概述 本文将介绍并解析两道有趣的Python算法题目,旨在帮助读者更好地理解Python语言的特点及其在处理字符串方面的优势。通过具体的示例代码,我们将深入探讨Python...

    python趣味编程100例.7z

    《Python趣味编程100例》是一份专为Python初学者设计的学习资源,它通过100个精心挑选的编程实例,旨在帮助新手快速掌握Python编程的基础知识和实践技巧。这个压缩包包含了丰富的源代码,并且每个示例都有详细的注释...

    Scratch编程入门与算法进阶.pptx

    第二部分是算法进阶,详细介绍了几个经典的算法问题及其对应的Scratch实现。这些问题包括约瑟夫环问题、最长回文子串、0/1背包问题、拓扑排序等。通过这些实例,读者可以深入理解算法的本质和实现方法,提高解决问题...

    Java趣味编程100例 清华大学出版社.zip

    本书取材注重趣味性与实用性,内容涵盖了Java编程的基础知识和常用算法,讲解时给出了实例的详细代码及注释。本书附带1张光盘,收录了本书配套多媒体教学视频及实例源文件,可大大方便读者高效、直观地学习本书内容...

    Scratch编程入门与算法进阶.docx

    Scratch 编程入门与算法进阶 Scratch 是一款为青少年设计的编程语言和平台,由麻省理工学院的媒体实验室(Media Lab)和哈佛大学的实验室(Graduate School of Education)联合开发。Scratch 的起源与发展可以追溯...

    “编”玩边学:Scratch趣味编程进阶妙趣横生的数学和算法.pptx

    "编"玩边学:Scratch趣味编程进阶妙趣横生的数学和算法 《“编”玩边学:Scratch趣味编程进阶妙趣横生的数学和算法》是一本旨在通过Scratch编程语言教授数学和算法知识的书籍。这本书的内容丰富、生动有趣,适合中...

    C/C++趣味编程100例

    《C/C++趣味编程100例》一书精选了100个经典、实用且充满趣味性的程序设计实例,旨在通过实践加深读者对C/C++语言的理解与掌握。本书覆盖了从基本图形绘制到复杂算法实现的广泛内容,不仅适合初学者入门,也能够帮助...

    教学论文:利用Scratch趣味编程与Pascal语言互动教学例谈.docx

    本文主要探讨了如何利用Scratch趣味编程与Pascal语言的互动教学方法,以提高小学生对编程的理解和兴趣。以下是对标题和描述中关键知识点的详细说明: 1. **Scratch趣味编程**:Scratch是一种面向儿童的图形化编程...

    趣味编程百例

    "趣味编程百例"是一个可能包含一系列有趣且富有挑战性的编程练习的集合,旨在帮助学习者提高编程技能,同时享受编程的乐趣。这些编程题目通常涵盖了基础到进阶的各种难度,适合不同程度的程序员进行实践和提升。 在...

    java趣味算法经典趣味算法

    6. **位操作**:Java的位操作可以用于高效地处理二进制数据,如快速幂运算、奇偶性检查等,是实现一些趣味算法的有效手段。 7. **模拟算法**:模拟真实世界的情况,如抛硬币、抽卡等概率问题,可以通过Java程序进行...

    JAVA趣味编程100实例

    在标题“JAVA趣味编程100实例”下,描述中提到“很实用的java趣味编程小程序”,这说明本文件旨在通过有趣的编程实例来帮助学习者加深对Java语言的理解和应用能力。通过解决实际问题来提高编程技能,这些实例很可能...

Global site tag (gtag.js) - Google Analytics