實現24點遊戲-窮舉法

yangliu_w發表於2017-04-08

演算法設計思路:

         窮舉法就是列出4個數字加減乘除的各種可能性。首先我們將4個數設為a,b,c,d,,將其排序列出四個數的所有排序序列組合(共有A44=24種組合)。再進行符號的排列表示式,其中算術符號有+,—,*,/,(,)。其中有效的表示式有a*(b-c/b),a*b-c*d,等等。列出所有有效的表示式。其中a,b,c,d的範圍是1到13。用隨機函式產生四個1-13的數。要實現24點的演算法,就是通過4個數字,4個運算子號和2對括號(最多為2對),通過各種組合判斷其結果是否為24。我們用a,b,c,d代替4個數字。考慮每種可能,總的演算法就有7種可能。

1沒括號的(形如a*b*c*d);

2有括號的(形如(a * b) * c * d);

3有括號的(形如(a * b * c) * d);

4有括號的(形如a * (b * c) * d);

5有括號的(形如(a * b) * (c * d));

6有括號的(形如((a * b) * c) * d);

7有括號的(形如(a * (b * c)) * d)。

我的程式對運算式子進行窮舉,去掉等價的和無效的,最終合法表示式只有73種。

/*
File name:24點遊戲.cpp
Author:楊柳
Date:2017.4.5
Function list:int Calculate ( float x, float y, float z, float w)
IDE:DEV-c++ 
*/
#include <iostream> 
#include <stdlib.h>
using namespace std; 
int flag=1;
int main() { 
int Calculate ( float x, float y, float z, float w);//函式宣告 
while(flag){
float a,b,c,d; 
int x;
	cout<<"隨機輸入4個資料"<<endl; 
    a=rand()%13+1;
	cout<<" 第一個數:"<<a<<endl;
	b=rand()%13+1; 
	cout<<" 第二個數:"<<b<<endl;
	c=rand()%13+1; 
	cout<<" 第三個數:"<<c<<endl; 
	d=rand()%13+1;
	cout<<" 第四個數:"<<d<<endl; 
    cout<<"輸出所有演算法如下:"<<endl;
 	Calculate (a,b,c,d);
 	cout<<"退出請按0 or 繼續請按1"<<endl;
    cin>>x;
    if(x==0)
       flag=0; 
 }

return 0;
 	 
 } 
  int Calculate ( float x, float y, float z, float w) // a .b.c.d 的所有排列組合情況和運算表示式的所有情況
{ 	
if(x*y-z+w==24)
    cout<<x<<"*"<<y<<"-"<<z<<"+"<<w<<"=24"<<endl; 	
if ((x-y)*z*w==24) 
    cout<<"("<<x<<"-"<<y<<")"<<"*"<<z<<"*"<<w<<"=24"<<endl;
if ((x*y)+(z*w)==24) 
	cout<<"("<<x<<"*"<<y<<")+("<<z<<"*"<<w<<")"<<"=24"<<endl; 
if ((x+y)*z*w==24) 
	cout<<"("<<x<<"+"<<y<<")"<<"*"<<z<<"*"<<w<<")"<<"=24"<<endl;
if (x*y*z*w==24) 
	cout<<x<<"*"<<y<<"*"<<z<<"*"<<w<<"=24"<<endl; 
if ((x+y*z)*w==24) 
	cout<<"("<<x<<"+"<<y<<"*"<<z<<")"<<"*"<<w<<"=24"<<endl; 	
if ((x*y-z)*w==24) 
	cout<<"("<<x<<"*"<<y<<"-"<<z<<")"<<"*"<<w<<"=24"<<endl; 	
if ((x*y)+z+w==24) 
	cout<<"("<<x<<"*"<<y<<")+"<<z<<"+"<<w<<"=24"<<endl; 	
if ((x/y-z)*w==24) 
	cout<<"("<<x<<"/"<<y<<"-"<<z<<")"<<"*"<<w<<"=24"<<endl; 	
if ((x-(y-z))*w==24) 
	cout<<"("<<x<<"-"<<"("<<y<<"-"<<z<<")"<<")*"<<w<<"=24"<<endl;	
if (x-(y-z-w)==24) 
	cout<<x<<"-"<<"("<<y<<"-"<<z<<"-"<<w<<")"<<"=24"<<endl;	
if (x+y-(z-w)==24) 
	cout<<x<<"+"<<y<<"-"<<"("<<z<<"-"<<w<<")"<<"=24"<<endl;	
if (x*(y/z-w)==24) 
	cout<<x<<"*"<<"("<<y<<"/"<<z<<"-"<<w<<")"<<"=24"<<endl;	
if ((x-y*z)*w==24) 
	cout<<"("<<x<<"-"<<y<<"*"<<z<<")"<<"*"<<w<<"=24"<<endl;	
if (x*(y-z)+w==24) 
	cout<<x<<"*"<<"("<<y<<"-"<<z<<")"<<"+"<<w<<"=24"<<endl;	
if (x+y+z/w==24) 
	cout<<x<<"+"<<y<<"+"<<z<<"/"<<w<<"=24"<<endl; 
if ((x-y)*(z-w)==24) 
    cout<<"("<<x<<"-"<<y<<")*("<<z<<"-"<<w<<")=24"<<endl; 
if ((x+y)*z/w==24) 
	cout<<"("<<x<<"+"<<y<<")*"<<z<<"/"<<w<<"=24"<<endl;     
if (x*y/(z-w)==24) 
	cout<<x<<"*"<<y<<"/"<<"("<<z<<"-"<<w<<")"<<"=24"<<endl; 		
if ((x+y)*(z+w)==24) 
    cout<<"("<<x<<"+"<<y<<")*("<<z<<"+"<<w<<")=24"<<endl;
if ((x-y)*z/w==24) 
    cout<<"("<<x<<"-"<<y<<")*"<<z<<"/"<<w<<"=24"<<endl; 	
if (x+(y+z)/w==24) 
	cout<<x<<"+"<<"("<<y<<"+"<<z<<")"<<"/"<<w<<"=24"<<endl;	
if (x*y/(z+w)==24) 
	cout<<x<<"*"<<y<<"/"<<z<<"+"<<w<<")"<<"=24"<<endl; 
if ((x+y)*z/w==24) 
	cout<<"("<<x<<"+"<<y<<")*"<<z<<"/"<<w<<"=24"<<endl; 
if ((x*y+z)*w==24) 
	cout<<"("<<x<<"*"<<y<<"+"<<z<<")"<<"*"<<w<<"=24"<<endl; 
if ((x*y-z)/w==24) 
	cout<<"("<<x<<"*"<<y<<"-"<<z<<")"<<"/"<<w<<"=24"<<endl; 
if ((x/y+z)*w==24) 
	cout<<"("<<x<<"/"<<y<<"+"<<z<<")"<<"*"<<w<<"=24"<<endl; 
if ((x*y)/z/w==24) 
	cout<<"("<<x<<"*"<<y<<")/"<<z<<"/"<<w<<"=24"<<endl;
if (x+y+z-w==24) 
	cout<<x<<"+"<<y<<"+"<<z<<"-"<<w<<"=24"<<endl;	
if (x-(y-z)+w==24) 
	cout<<x<<"-"<<"("<<y<<"-"<<z<<")"<<"+"<<w<<"=24"<<endl;	
if (x/(y-z/w)==24) 
	cout<<x<<"/"<<"("<<y<<"-"<<z<<"/"<<w<<")"<<"=24"<<endl;	
if (x+(y-z)*w==24) 
	cout<<x<<"+"<<"("<<y<<"-"<<z<<")*"<<w<<"=24"<<endl;	
if ((x+y+z)*w==24) 
	cout<<"("<<x<<"+"<<y<<"+"<<z<<")*"<<w<<"=24"<<endl; 	
if ((x+y+z)*w==24) 
	cout<<"("<<x<<"+"<<y<<"+"<<z<<")*"<<w<<"=24"<<endl; 	
if (x+y*z-w==24) 
	cout<<x<<"+"<<y<<"*"<<z<<"-"<<w<<"=24"<<endl; 	
if (x*y-z/w==24) 
	cout<<x<<"*"<<y<<"-"<<z<<"/"<<w<<"=24"<<endl; 	
if ((x+y)*z-w==24) 
	cout<<"("<<x<<"+"<<y<<"*"<<z<<"-"<<w<<"=24"<<endl; 
if ((x-y/z)*w==24) 
	cout<<"("<<x<<"-"<<y<<"/"<<z<<")*"<<w<<"=24"<<endl; 
if (x*(y+z)+w==24) 
	cout<<x<<"*"<<"("<<y<<"+"<<z<<")"<<"+"<<w<<"=24"<<endl;
if ((x*y)+(z/w)==24) 
	cout<<"("<<x<<"*"<<y<<")-("<<z<<"/"<<w<<")"<<"=24"<<endl;
if ((x*y)/z-w==24) 
	cout<<"("<<x<<"*"<<y<<")/"<<z<<"-"<<w<<"=24"<<endl; 
if ((x+y/z)*w==24) 
	cout<<"("<<x<<"+"<<y<<"/"<<z<<")*"<<w<<"=24"<<endl; 
if ((x*y*z)/w==24) 
	cout<<"("<<x<<"*"<<y<<"*"<<z<<")/"<<w<<"=24"<<endl;
if ((x+y*z)/w==24) 
	cout<<"("<<x<<"+"<<y<<"*"<<z<<")/"<<w<<"=24"<<endl;
if (x+(y*z)+w==24) 
	cout<<x<<"+"<<"("<<y<<"*"<<z<<")+"<<w<<"=24"<<endl;
if (x-(y+z)*w==24) 
	cout<<x<<"-("<<y<<"+"<<z<<")*"<<w<<"=24"<<endl;
if (x-(y-z)*w==24) 
	cout<<x<<"-("<<y<<"-"<<z<<")*"<<w<<"=24"<<endl;
if ((x*y)-z-w==24) 
	cout<<"("<<x<<"*"<<y<<")-"<<z<<"-"<<w<<"=24"<<endl;
if (x+y/z+w==24) 
    cout<<x<<"+"<<y<<"/"<<z<<"+"<<w<<"=24"<<endl;
if ((x-y)*z-w==24) 
    cout<<"("<<x<<"-"<<y<<"*"<<z<<"-"<<w<<"=24"<<endl;
if ((x+y)/z+w==24) 
    cout<<"("<<x<<"+"<<y<<"/"<<z<<"+"<<w<<"=24"<<endl;
if ((x*y)+z-w==24) 
	cout<<"("<<x<<"*"<<y<<")+"<<z<<"-"<<w<<"=24"<<endl;
if ((x/y)+z+w==24) 
	cout<<"("<<x<<"/"<<y<<"+"<<z<<"+"<<w<<"=24"<<endl;
if ((x*y)*z-w==24) 
	cout<<"("<<x<<"*"<<y<<")*("<<z<<")-"<<w<<"=24"<<endl;
if ((x*y+z)/w==24) 
	cout<<"("<<x<<"*"<<y<<"+"<<z<<")/"<<w<<"=24"<<endl;
if (x+y+z*w==24) 
	cout<<x<<"+"<<y<<"+"<<z<<"*"<<w<<"=24"<<endl;
if (x*(y-z)/w==24) 
	cout<<x<<"*"<<"("<<y<<"-"<<z<<")/"<<w<<"=24"<<endl;
if (x/y*z+w==24) 
	cout<<x<<"/"<<y<<"*"<<z<<"+"<<w<<"=24"<<endl;
if (x+y*z*w==24) 
	cout<<x<<"+"<<y<<"*"<<z<<"*"<<w<<"=24"<<endl;
if (x+y+z+w==24) 
	cout<<x<<"+"<<y<<"+"<<z<<"+"<<w<<"=24"<<endl;
if ((x*y)/(z*w)==24) 
	cout<<"("<<x<<"*"<<y<<")/("<<z<<"*"<<w<<")"<<"=24"<<endl; 
if (x+(y+z)*w==24) 
	cout<<x<<"+("<<y<<"+"<<z<<")*"<<w<<"=24"<<endl; 
if ((x-y)*z+w==24) 
	cout<<"("<<x<<"-"<<y<<"*"<<z<<"+"<<w<<"=24"<<endl; 
if ((x+y+z)/w==24) 
	cout<<"("<<x<<"+"<<y<<"+"<<z<<")/"<<w<<"=24"<<endl; 
if ((x+y)*z+w==24) 
    cout<<"("<<x<<"+"<<y<<")*"<<z<<"+"<<w<<"=24"<<endl;	 	
if ((x*y)*z+w==24) 
	cout<<"("<<x<<"*"<<y<<")*("<<z<<")+"<<w<<"=24"<<endl; 	
if ((x*y)-(z-w)==24) 
	cout<<"("<<x<<"*"<<y<<")-("<<z<<"-"<<w<<")"<<"=24"<<endl;	
if ((x*y)-(z+w)==24) 
	cout<<"("<<x<<"*"<<y<<")-("<<z<<"+"<<w<<")"<<"=24"<<endl;
 if ((x-y-z)*w==24) 
	cout<<"("<<x<<"-"<<y<<"-"<<z<<")*"<<w<<"=24"<<endl; 
if ((x*y)/z+w==24) 
	cout<<"("<<x<<"*"<<y<<")/"<<z<<"+"<<w<<"=24"<<endl; 
if ((x+y-z)*w==24) 
	cout<<"("<<x<<"+"<<y<<"-"<<z<<")*"<<w<<"=24"<<endl; 	
if (x/(y/z-w)==24) 
	cout<<x<<"/("<<y<<"/"<<z<<"-"<<w<<")=24"<<endl;  	
if ((x*y)-(z*w)==24) 
	cout<<"("<<x<<"*"<<y<<")-("<<z<<"*"<<w<<")"<<"=24"<<endl; 	
	
	
	

//else 
	//cout<<"不可以組成24"<<endl; return 0; 
}



最終效果圖





相關文章