关于24点游戏的问题
哪位大虾知道怎样实现24点游戏的算法,就是任意给定四张牌,怎样判断这四张牌能通过运算得到24。谈谈思想就可以啦。
[解决办法]
import java.util.ArrayList;
import java.util.List;
//算24点
public class Sum24 {
public List list=new ArrayList();
public int n[]=new int[4];
public List strList=new ArrayList();
//初始化1~13随机选4个数
Sum24(){
n[0]=(int)(Math.random()*13+1);
n[1]=(int)(Math.random()*13+1);
n[2]=(int)(Math.random()*13+1);
n[3]=(int)(Math.random()*13+1);
System.out.println( "四张牌为 ");
System.out.println(n[0]);
System.out.println(n[1]);
System.out.println(n[2]);
System.out.println(n[3]);
}
public void result(){ //显示最终结果计算表达式
for(int i=0;i <strList.size();i++){
System.out.println();
String str[]=(String[])(strList.get(i));
for(int j=0;j <7;j++){
System.out.print(str[j]);
}
System.out.print( "=24 ");
}
}
public void showList(){ //显示所有排列组合
for(int i=0;i <list.size();i++){
System.out.println();
int a[]=(int[])(list.get(i));
for(int j=0;j <4;j++){
System.out.print(a[j]+ " ");
}
}
}
public void quanpai(int intArray[]){ //全排列
for(int i=0;i <4;i++){
for(int j=0;j <4;j++){
if(j!=i)
for(int k=0;k <4;k++){
if((k!=j)&&(k!=i))
for(int m=0;m <4;m++){
if((m!=j)&&(m!=i)&&(m!=k)){
int a[]=new int[4];
a[0]=intArray[i];
a[1]=intArray[j];
a[2]=intArray[k];
a[3]=intArray[m];
//去掉重复的
for(int l=0;l <list.size();l++){
int b[]=(int [])list.get(l);
if((a[1]==b[1])&&(a[2]==b[2])&&(a[3]==b[3])&&(a[0]==b[0]))
list.remove(l);
}
list.add(a);
}
}
}
}
}
System.out.println();
}//end quanpai
public int Js2(int s1,int s2,String str){ //取两个数进行运算
if(str.equals( "+ "))return s1+s2;
if(str.equals( "- ")){
return s1-s2;
}
if(str.equals( "* "))return s1*s2;
if(str.equals( "/ ")){
if((s2!=0)&&(s1%s2==0))return s1/s2;
else return -999;
}
return 0;
}
/*4个数运算形式
*形式1 ((a@b)@c)@d
*形式2(a@b)@(c@d)
*形式3 (c@(a@b))@d
* */
public void Js4(){ //4个数运算得24
String str[]={ "+ ", "- ", "* ", "/ "};
for(int i=0;i <list.size();i++){
int a[]=(int[])(list.get(i));
for(int m=0;m <4;m++)
for(int j=0;j <4;j++)
for(int k=0;k <4;k++){
//形式1
if(Js2(Js2(Js2(a[0],a[1],str[m]),a[2],str[j]),a[3],str[k])==24){
String string[]=new String[7];
string[0]= "[ "+ "( "+a[0];
string[1]=str[m];
string[2]=a[1]+ ") ";
string[3]=str[j];
string[4]=a[2]+ "] ";
string[5]=str[k];
string[6]=a[3]+ " ";
strList.add(string);
}
//形式2
if (Js2(Js2(a[0],a[1],str[m]),Js2(a[2],a[3],str[j]),str[k])==24){
String string[]=new String[7];
string[0]= "( "+a[0];
string[1]=str[m];
string[2]=a[1]+ ") ";
string[3]=str[j];
string[4]= "( "+a[2];
string[5]=str[k];
string[6]=a[3]+ ") ";
strList.add(string);
}
//形式3
if(Js2(Js2(a[2],Js2(a[0],a[1],str[m]),str[j]),a[3],str[k])==24){
String string[]=new String[7];
string[0]= "[ "+a[2];
string[1]=str[j];
string[2]= "( "+a[0];
string[3]=str[m];
string[4]=a[1]+ ") "+ "] ";
string[5]=str[k];
string[6]=a[3]+ " ";
strList.add(string);
}
}
}
}
public static void main(String arg[]){
Sum24 s=new Sum24();
s.result();
s.quanpai(s.n);
//s.showList();
s.Js4();
s.result();
}
}
[解决办法]
随机选四个数(1..10)之间,经过加减乘除(浮点运算)后结果为24.
1..10之间可以随机重复数字.如可以选4个5.
要求进行括号化简,并去除重复形式如:3*8+8-8 <==> 3*8-8+8
[解决办法]
参见我的主页,提供了两种算法,分别采用了穷举和递归的方法。
http://www.luoxf.net/index.php?option=com_content&task=view&id=107&Itemid=2