用扑克牌计算24点

用扑克牌计算24点(线性结构,数组)

[问题描述]
一副扑克牌的每张牌表示一个数(J、Q、K分别表示11、12、13,两个司令都表示6)。任取4张牌,即得到1-13的数,请添加运算符(规定为加、减、乘、除四种)使之成为运算式。每个数只能参与一次运算,4个数顺序可以任意组合,4个运算符任意取3个且可以重复取。运算遵从一定有限级别,可加括号控制,最终使运算结果为24.请输出一种解决方案的表达式,用括号表示运算优先。如果没有解决方案,则输出-1表示无解。
[基本要求]
(1)输入说明:在一行中给出4个整数,每个整数取值范围是[1, 13].
(2)输出说明:输出一种解决方案的表达式,用括号表示运算优先,如果没有解决方案,则输出-1。
(3)测试用例: 输入 2 3 12 12 输出 ((3-2)*12)+12
(4)可选要求:输入采用随机生成4个整数, 输出要求输出该4个整数所有可能的解决方案。

数据结构
使用栈操作,与深度搜索相结合
typedef int AdjMatrix[MAX_VERTEX_NUM][MAX_VERTEX_NUM];

算法设计思想
设置两个函数,运用多重循环语句实现所有的数字和运算符排列组合的可能,同时不能重复,若重复则continue继续组合,依次判断各种组合的运算结果是否满足24,若满足则输出。

测试数据和结果
测试数据:随机生成四个数
结果:
在这里插入图片描述
在这里插入图片描述

算法时间复杂度
void Show_24 ( int a[] ) //对数字顺序进行排列组合
时间复杂度:O(nnnn)
int get_24(int i, int j, int k, int t) //对运算符进行排列组合
时间复杂度:O(n
n*n)

代码如下:

#include <iostream>
#include<stdlib.h>
#include<fstream>
#include<string.h>
#include <iomanip>
#include<ctime>
using namespace std;
char YunSuan[5]= {'#','+','-','*','/',};
double cal(double x, double y, int  YunSuan)
{
    switch( YunSuan)
    {
    case 1:return x+y;
    case 2:return x-y;
    case 3:return x*y;
    case 4:return x/y;
    }
}

double reckon1(double i, double j, double k, double t, int a, int b, int c)//¼ÆËãģʽ
{
    double r1, r2, r3;
    r1 = cal(i, j, a);
    r2 = cal(r1, k, b);
    r3 = cal(r2, t, c);
    return r3;
}

double reckon2(double i, double j, double k, double t, int a, int b, int c)
{
    double r1, r2, r3 ;
    r1 = cal(i, j, a);
    r2 = cal(k, t, c);
    r3 = cal(r1, r2, b);
    return r3;
}

double reckon3(double i, double j, double k, double t, int a, int b, int c)
{
    double r1, r2, r3;
    r1 = cal(j, k, b);
    r2 = cal(i, r1, a);
    r3 = cal(r2, t, c);
    return r3;
}

double reckon4(double i, double j, double k, double t, int a, int b, int c)
{
    double r1, r2, r3 ;
    r1 = cal(k, t, c);
    r2 = cal(j, r1, b);
    r3 = cal(i, r2, a);
    return r3;
}

double reckon5(double i, double j, double k, double t, int a, int b, int c)
{
    double r1, r2, r3;
    r1 = cal(j, k, b);
    r2 = cal(r1, t, c);
    r3 = cal(i, r2, a);
    return r3;
}
//对运算符进行排列组合
int get_24(int i, int j, int k, int t)
{
    int a, b, c, flag=0;//a,b,c表示三种运算符
    for ( a= 1; a <= 4; a++)
    {
        for ( b = 1; b <= 4; b++)
        {
            for ( c = 1; c <= 4; c++)
            {
                if (reckon1(i,j,k,t,a,b,c) == 24)
                {
                   cout<< "(("<<i << YunSuan[a]<<j<<")"<< YunSuan[b] ;
                   cout<< k << ")" << YunSuan[c]<<t <<endl;
                   flag=1;
                   break;
                }
                if (reckon2(i,j,k,t,a,b,c) == 24)
                {
                    cout<< "("<< i << YunSuan[a] << j <<")" << YunSuan[b] << "(";
                    cout<< k << YunSuan[c] << t << ")" <<endl;
                     flag=1;
                    break;

                }
                if (reckon3(i,j,k,t,a,b,c) == 24)
                {
                    cout<<"("<< i << YunSuan[a] << "(" << j << YunSuan[b] ;
                    cout<< k <<")"<< YunSuan[c] << t  <<endl;
                    flag=1;
                    break;
                }
                if (reckon4(i,j,k,t,a,b,c) == 24)
                {
                    cout<< i << YunSuan[a] << "(" << j << YunSuan[b] ;
                    cout<< "("<<k << YunSuan[c] << t << "))" <<endl;
                    flag=1;
                    break;
                }
                if (reckon5(i,j,k,t,a,b,c) == 24)
                {
                    cout<< i << YunSuan[a] << "((" << j << YunSuan[b] << k << ")";
                    cout<< YunSuan[c] << t << ")" <<endl;
                     flag=1;
                     break;
                }
           }
        }
    }
    return flag;
}
//对数字顺序进行排列组合
void Show_24 ( int a[] )
{
    int flag, i, j, k, h;
    int t1, t2, t3, t4;
    for(i = 0; i < 4; i++)
    {
        for( j = 0; j < 4; j++)
        {
            if( j == i )
                continue;
            for( k = 0; k < 4; k++)
            {
                if( i==k || j==k )
                    continue;
                for( h = 0; h < 4; h++ )
                {
                    if ( h==i || h==j || h==k )
                        continue;
                    t1 = a[i], t2= a[j], t3= a[k], t4= a[h];
                    flag = get_24(t1, t2, t3, t4);
                    if ( flag == 1 )
                         continue;
                }
                if( flag == 1 )
                   continue;
            }
            if( flag == 1 )
                continue;
        }
        if(flag == 1)
            continue;
    }
}

int main()
{
    int a[4];
    int i;
    time_t t;
    srand((unsigned)time(&t));
    for( i = 0; i < 4; i++)
    {
        a[i] = rand()%13+1;
        cout<< a[i]<<" ";
    }
    cout<<endl;
    Show_24 ( a );
    return 0;
}


扑克牌24点游戏是一种玩法类似于上面提到的数学游戏的游戏。以下是一个C语言实现,可以用扑克牌进行游戏: ```c #include <stdio.h> #include <stdlib.h> #include <time.h> int check(double a, double b, double c, double d) { double exp[5]; int i, j, k, l, m; for (i = 0; i < 4; i++) { for (j = 0; j < 4; j++) { if (j == i) continue; for (k = 0; k < 4; k++) { if (k == i || k == j) continue; for (l = 0; l < 4; l++) { if (l == i || l == j || l == k) continue; exp[0] = a; exp[1] = b; exp[2] = c; exp[3] = d; for (m = 0; m < 5; m++) { if (m == 0) exp[m] = exp[i] + exp[j]; else if (m == 1) exp[m] = exp[i] - exp[j]; else if (m == 2) exp[m] = exp[i] * exp[j]; else if (m == 3 && exp[j] != 0) exp[m] = exp[i] / exp[j]; else continue; exp[i] = exp[k]; exp[j] = exp[l]; exp[k] = exp[m]; if (k > l) { int temp = k; k = l; l = temp; } exp[l] = exp[3]; if (exp[2] == 24) return 1; } } } } } return 0; } int main() { int i, j, k, l; double a, b, c, d; srand(time(NULL)); while (1) { i = rand() % 13 + 1; j = rand() % 13 + 1; k = rand() % 13 + 1; l = rand() % 13 + 1; if (check(i, j, k, l)) { printf("找到了一组可以得到24的扑克牌:"); if (i == 1) printf("A "); else if (i == 11) printf("J "); else if (i == 12) printf("Q "); else if (i == 13) printf("K "); else printf("%d ", i); if (j == 1) printf("A "); else if (j == 11) printf("J "); else if (j == 12) printf("Q "); else if (j == 13) printf("K "); else printf("%d ", j); if (k == 1) printf("A "); else if (k == 11) printf("J "); else if (k == 12) printf("Q "); else if (k == 13) printf("K "); else printf("%d ", k); if (l == 1) printf("A "); else if (l == 11) printf("J "); else if (l == 12) printf("Q "); else if (l == 13) printf("K "); else printf("%d ", l); printf("\n"); break; } } return 0; } ``` 这个程序中,使用了和上面类似的`check`函数来判断给定的四张扑克牌是否可以得到24。程序使用了`rand()`函数来生成四张随机的扑克牌,如果可以得到24,则输出这四张牌的面值。如果不行,则继续生成新的组合,直到找到一组可以得到24的牌为止。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值