hdu 1427 速算24点(next_permutation 搜索)

题意:给出四张扑克牌 问能否算出24

思路:http://blog.csdn.net/xingyeyongheng/article/details/11137631

其实这题只有两种运算顺序

1([email protected])@[email protected]

2 ([email protected])@([email protected])

所以只需要把数字和运算符全排列遍历一边就可以判断出结果

#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;
}

  

时间: 2024-08-04 15:08:20

hdu 1427 速算24点(next_permutation 搜索)的相关文章

hdu 1427 速算24点 dfs暴力搜索

速算24点 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Problem Description 速算24点相信绝大多数人都玩过.就是随机给你四张牌,包括A(1),2,3,4,5,6,7,8,9,10,J(11),Q(12),K(13).要求只用'+','-','*','/'运算符以及括号改变运算顺序,使得最终运算结果为24(每个数必须且仅能用一次).游戏很简单,但遇到无解的

HDU 1427 速算24点【数值型DFS】

速算24点 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 2562    Accepted Submission(s): 606 Problem Description 速算24点相信绝大多数人都玩过.就是随机给你四张牌,包括A(1),2,3,4,5,6,7,8,9,10,J(11),Q(12),K(13).要求只用'+','-','*

[HDU 1427]速算24点(DFS暴搜)

题目连接:  http://acm.hdu.edu.cn/showproblem.php?pid=1427 思路:简单的DFS,dfs(sum,next,p)表示当前已经算出的值是sum,括号中算出的值是next,当前使用的卡片下标为p,实际上是把括号外和括号内的两部分值分成sum和next来处理了. 直觉告诉我们4个数只需要一层括号参与运算就够了,不会也不必用多重括号改变运算顺序,因此上面的dfs思路是正确的. 那么对于下一张卡片,有两种处理方式: 1.把next算入sum中,下一张卡片成

HDU 1427 速算24点

全排列,枚举运算符,枚举优先级. #include<cstdio> #include<cstring> #include<cmath> #include<algorithm> using namespace std; const int INF=0x7FFFFFFF; char s[5]; int a[5],b[5],f[5],op[5],ans; int get() { if(s[0]=='A') return 1; if(s[0]=='J') retur

Hdoj 1427 速算24点 【DFS】

速算24点 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 3574    Accepted Submission(s): 869 Problem Description 速算24点相信绝大多数人都玩过.就是随机给你四张牌,包括A(1),2,3,4,5,6,7,8,9,10,J(11),Q(12),K(13).要求只用'+','-','

HDU 1247 速算24点_BFS

1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #define CL(x, y) memset(x, y, sizeof(x)) 5 using namespace std; 6 const int INF = 1 << 30; 7 int num[4], res[4], used[4]; 8 int flag; 9 int getNum(char ch); 10 int ca

【算法29】速算24

问题描述 题目来源:PAT ds 2-08 给定四个数字a, b, c, d,取值范围为[1, 13]:添加合适的运算符 + , - , * , /, 和括号(, )使得表达式等于24,给出一种可能的表达式方案:如果不可能则返回-1. 例如:输入2, 3, 12, 12, 输出 ((3-2)*12) + 12. 输入5, 5, 5, 2, 输出-1. 问题分析 这个题目似乎没有好的算法,只能暴力搜索. 首先对于所有给个数字进行全排列,总过有$A_4^4 = 24$中排列方式: 然后对于每一种排列

Problem A: 速算24点

Description 速算24点相信绝大多数人都玩过.就是随机给你四张牌,包括 A(1),2,3,4,5,6,7,8,9,10,J(11),Q(12),K(13).要求只用'+','-','*','/'运算符以及括号改变运算 顺序,使得最终运算结果为24(每张牌必须且仅能用一次).游戏很简单,但遇到无解的情况往往让人很郁闷.你的任务就是针对每一组随机产生的四张牌,判断 是否有解.我们另外规定,整个计算过程中都不能出现小数. Input 输入数据占一行,给定四张牌. Output 如果有解则输出

速算24点问题

问题: 速算24点相信绝大多数人都玩过.就是随机给你四张牌,包括A(1),2,3,4,5,6,7,8,9,10,J(11),Q(12),K(13).要求只用'+','-','*','/'运算符以及括号改变运算顺序,使得最终运算结果为24(每个数必须且仅能用一次).游戏很简单,但遇到无解的情况往往让人很郁闷.你的任务就是针对每一组随机产生的四张牌,判断是否有解.我们另外规定,整个计算过程中都不能出现小数. 回答: #include<iostream>      #include<cstdi