24点游戏起源于扑克牌智力游戏。
规则:
A-10:分别代表数字 1-10。J,Q,K:分别代表数字11,12,13。
给四张扑克牌,用加减乘除和括号,得出24.
考虑到规模比较小,可以通过穷举的方法来得出结果,最多穷举1536次。
具体看源代码:
#include <iostream>
#include <cmath>
#include <ctime>
#include <cstdio>
int GetNum()
{
static int nums[1000];
static int index = -1;
if(index == -1 || index >= 1000)
{
srand( (unsigned)time(NULL) );
for(int i=0;i<1000;i++)
{
nums[i] = rand();
}
index = 0;
}
return nums[index++];
}
char uppercase(char a)
{
if(a>=97 && a<=122)
return (a - 32);
else
return a;
}
int operate(int a,int b,int op)
{
switch(op)
{
case 0:
return a+b;
case 1:
return a-b;
case 2:
return a*b;
case 3:
if(a%b == 0)
return a/b;
default:
return 10000; //若a不能整除b返回一个很大的数 使它不能等于24
}
}
char GetSign(int op)
{
switch(op)
{
case 1:
return '-';
case 2:
return '*';
case 3:
return '/';
case 0:
return '+';
default:
return '?';
}
}
void caculate(int data[],int array[])
{
int times = 0;
// 穷举所有可能
// i1 i2 i3 i4 为变量 i5 i6 i7 为运算符
for(int i1 = 0;i1<4;i1++)
for(int i2 = 0;i2<4;i2++)
{
if(i2==i1)
continue;
for(int i3=0;i3<4;i3++)
{
if(i3==i1||i3==i2)
continue;
for(int i4=0;i4<4;i4++)
{
if(i4==i1||i4==i2||i4==i3)
continue;
for(int i5=0;i5<4;i5++)
{
for(int i6=0;i6<4;i6++)
{
for(int i7=0;i7<4;i7++)
{
//计算三次
times++;
int k1 = operate(data[i1],data[i2],i5);
k1 = operate(k1,data[i3],i6);
k1 = operate(k1,data[i4],i7);
if(k1==24)
{
array[8] = times;
array[0] = 1;
array[1] = i1;
array[2] = i2;
array[3] = i3;
array[4] = i4;
array[5] = i5;
array[6] = i6;
array[7] = i7;
return;
}
}//i7
}//i6
}//i5
}//i4
}//i3
}//i2
array[0] = 0;
array[8] = times;
}
int main(void)
{
int data[4];
int array[9]; // array[0]表示是否有计算 array[1~7] 表达式 array[8] 计算次数
char order = '\0';
while(true)
{
std::cout<<" auto create data(A) or Read from file (R) or Manual input (M):";
while(std::cin>>order,order = uppercase(order),order!='A' && order != 'R' &&order != 'M')
{
std::cout<<" auto create data(A) or read from file (R) or Manual input (M):";
}
switch(order)
{
case 'A' :
{
for(int i=0;i<4;i++)
{
data[i] = GetNum()%13+1;
}
break;
}
case 'H':
{
int tp;
for(int i=0;i<4;i++)
{
std::cin>>tp;
data[i] = tp;
}
break;
}
case 'M' :
{
int tp = 0;
char fname[100];
std::cout<<"input filename:";
std::cin>>fname;
FILE *fp = fopen(fname,"r");
if(fp)
{
for(int i=0;i<4;i++)
{
fscanf(fp,"%d",tp);
data[i] = tp;
}
fclose(fp);
}
else
{
std::cout<<"read file error!\n";
return 0;
}
break;
}
}
std::cout<<"the data: ";
for(int i=0;i<4;i++)
std::cout<<data[i]<<' ';
caculate(data,array);
if(array[0])
{
std::cout<<"\nthe result: ";
std::cout<<"(("<<data[array[1]]<<GetSign(array[5])<<data[array[2]]<<')'
<<GetSign(array[6])<<data[array[3]]<<')'
<<GetSign(array[7])<<data[array[4]]<<std::endl;
}
else
{
std::cout<<"\nThey can't Get 24!"<<std::endl;
}
std::cout<<"The running count is "<<array[8]<<std::endl;
}
return 0;
}