标签:
题意:给出四张扑克牌 问能否算出24
思路:http://blog.csdn.net/xingyeyongheng/article/details/11137631
其实这题只有两种运算顺序
1(a@b)@c@d
2 (a@b)@(c@d)
所以只需要把数字和运算符全排列遍历一边就可以判断出结果
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
int num[5],ok;
const int INF=100000;
int change_num(char a)
{
if(a==‘A‘) return 1;
else if(a==‘J‘) return 11;
else if(a==‘Q‘) return 12;
else if(a==‘K‘) return 13;
if(a==‘1‘) return 10;
else return a-‘0‘;
}
int fun2(int a,int op,int b)
{
if(op==0)
{
return a+b;
}
else if(op==1)
{
return a-b;
}
else if(op==2)
{
return a*b;
}
else if(op==3)
{
if(b==0||a%b!=0 )return INF;
return a/b;
}
}
void fun1(int i,int j,int k)
{
if(ok==1) return;
int t1,t2,t3;
t1=fun2(num[0],i,num[1]);
if(t1!=INF)
{
t2=fun2(t1,j,num[2]);
if(t2!=INF)
{
t3=fun2(t2,k,num[3]);
if(t3==24||t3==-24) ok=1;
}
}
if(ok==0)
{
t1=fun2(num[0],i,num[1]);
t2=fun2(num[2],j,num[3]);
if(t1!=INF&&t2!=INF)
{
t3=fun2(t1,k,t2);
if(t3==24||t3==-24) ok=1;
}
}
}
int main()
{
int i,j,k;
char temp[5];
while(scanf("%s",temp)!=EOF)
{
ok=0;
num[0]=change_num(temp[0]);
for(i=1;i<=3;i++)
{
scanf("%s",temp);
num[i]=change_num(temp[0]);
}
sort(num,num+4);
do
{
for(i=0;i<4;i++)
{
for(j=0;j<4;j++)
{
for(k=0;k<4;k++)
{
fun1(i,j,k);
}
}
}
if(ok==1) break;
}while (next_permutation(num,num+4));
if(ok==1) printf("Yes\n");
else printf("No\n");
}
return 0;
}
hdu 1427 速算24点(next_permutation 搜索)
标签:
原文地址:http://www.cnblogs.com/sola1994/p/4495531.html