hdu 1427 速算24点

本文通过穷举法解决了特定数学谜题,利用代码实现并优化了算法效率。介绍了数学谜题的背景、解题思路及代码实现过程,详细阐述了如何通过穷举所有可能情况来得出正确答案。
   本题采用穷举所有情况即可得出结果。我们来计算一下,首先4个数的位置变换有24种,每种加上有运算符4*4*4=64种,每种有六种运算次序,所以时间复杂度24*64*6。对于人工计算,当然是很难得,但是计算机1秒之内是的得出来答案的,并且,还不是每一个都需要这么多次。
代码如下:
#include<stdio.h>
#include<string.h>
#define Inf 0xfffffff

int num[10],save[10],flag[10],ans[14][14][14][14];
char s1[3],s2[3],s3[3],s4[6];

int get(char s){
int t;
if(s=='A')
t=1;
else if(s=='J')
t=11;
else if(s=='Q')
t=12;
else if(s=='K')
t=13;
else
t=s-'0';
return t;
}

void Exchange(){
int i,k,t,j;
if(strlen(s1)==1)
save[0]=get(s1[0]);
else
save[0]=10;
if(strlen(s2)==1)
save[1]=get(s2[0]);
else
save[1]=10;
if(strlen(s3)==1)
save[2]=get(s3[0]);
else
save[2]=10;
if(strlen(s4)==1)
save[3]=get(s4[0]);
else
save[3]=10;
for(i=0;i<3;i++){
k=i;
for(j=i+1;j<4;j++)
if(save[j]<save[k])
k=j;
if(k!=i){
t=save[i];
save[i]=save[k];
save[k]=t;
}
}
}

int Ba(int x,int s,int y){
int t;
switch(s){
case 0:t=x+y;break;
case 1:t=x-y;break;
case 2:t=x*y;break;
case 3:if(y!=0 && x%y==0)t=x/y;
  else
  t=Inf;break;
}
return t;
}
int one(int a,int b,int c){
int Result1,Result2,Result;
Result1=Ba(num[0],a,num[1]);
if(Result1==Inf)
return 0;
Result2=Ba(num[2],b,num[3]);
if(Result2==Inf)
return 0;
Result=Ba(Result1,c,Result2);
if(Result==Inf || Result!=24)
return 0;
return 1;
}

int two(int a,int b,int c){
int Result1,Result2,Result;
Result1=Ba(num[0],a,num[1]);
if(Result1==Inf)
return 0;
Result2=Ba(Result1,b,num[2]);
if(Result2==Inf)
return 0;
Result=Ba(Result2,c,num[3]);
if(Result==Inf || Result!=24)
return 0;
return 1;
}

int three(int a,int b,int c){
int Result1,Result2,Result;
Result1=Ba(num[1],a,num[2]);
if(Result1==Inf)
return 0;
Result2=Ba(num[0],b,Result1);
if(Result2==Inf)
return 0;
Result=Ba(Result2,c,num[3]);
if(Result==Inf || Result!=24)
return 0;
return 1;
}

int four(int a,int b,int c){
int Result1,Result2,Result;
Result1=Ba(num[1],a,num[2]);
if(Result1==Inf)
return 0;
Result2=Ba(num[0],b,Result1);
if(Result2==Inf)
return 0;
Result=Ba(Result2,c,num[3]);
if(Result==Inf || Result!=24)
return 0;
return 1;
}

int five(int a,int b,int c){
int Result1,Result2,Result;
Result1=Ba(num[2],a,num[3]);
if(Result1==Inf)
return 0;
Result2=Ba(num[1],b,Result1);
if(Result2==Inf)
return 0;
Result=Ba(num[0],c,Result2);
if(Result==Inf || Result!=24)
return 0;
return 1;
}

int Judge(){//穷举64种运算
int i,j,k;
for(i=0;i<4;i++)
for(j=0;j<4;j++)
for(k=0;k<4;k++){
if(one(i,j,k) || two(i,j,k) || three(i,j,k) || four(i,j,k) || five(i,j,k))//穷举5种次序
return 1;
}
return 0;
}

int Dfs(int x){//穷举24种状态
if(x==4){
if(Judge())
return 1;
return 0;
}
int i;
for(i=0;i<4;i++){
if(!flag[i]){
flag[i]=1;
num[x]=save[i];
if(Dfs(x+1))
return 1;
flag[i]=0;
}
}
return 0;
}
void make(){
memset(flag,0,sizeof(flag));
if(ans[save[0]][save[1]][save[2]][save[3]] || Dfs(0))
{
ans[save[0]][save[1]][save[2]][save[3]]=1;//优化
printf("Yes\n");
}
else
printf("No\n");
}
int main(){
while(scanf("%s%s%s%s",s1,s2,s3,s4)!=EOF){
Exchange();
make();
}
return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值