黑马程序员------24点游戏

------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------


今天又遇到了一个比较难的题目,网上查了半天写的都比较乱。因为我零基础,代码相当不规范,希望多多见谅。不多说,下面我贴上代码给其他零基础的有个参考。


题目说明
计算24点是一种扑克牌益智游戏,随机抽出4张扑克牌,通过加(+),减(-),乘(*), 除(/)四种运算法则计算得到整数24,本问题中,扑克牌通过如下字符或者字符串表示,其中,小写joker表示小王,大写JOKER表示大王:
                   3 4 5 6 7 8 9 10 J Q K A 2joker JOKER
本程序要求实现:输入4张牌,输出一个算式,算式的结果为24点。
详细说明:
1.运算只考虑加减乘除运算,没有阶乘等特殊运算符号,友情提醒,整数除法要当心;
2.牌面2~10对应的权值为2~10, J、Q、K、A权值分别为为11、12、13、1;
3.输入4张牌为字符串形式,以一个空格隔开,首尾无空格;如果输入的4张牌中包含大小王,则输出字符串“ERROR”,表示无法运算;
4.输出的算式格式为4张牌通过+-*/四个运算符相连,中间无空格,4张牌出现顺序任意,只要结果正确;
5.输出算式的运算顺序从左至右,不包含括号,如1+2+3*4的结果为24
6.如果存在多种算式都能计算得出24,只需输出一种即可,如果无法得出24,则输出“NONE”表示无解。


输入                                输出
A A A A                          NONE
3  2 4 joker                     ERROR
3 J 3 K                            3/3*J+K


<span style="font-size:14px;">代码:
//
//  main.c
//  24pointGame
//
//  Created by Bo on 15-2-10.
//  Copyright (c) 2015年 Bo All rights reserved.
//

#include
#include
#include
int isDone;
double cards[4]; //存储输入的四张牌
int flag[4]; //dfs时标记哪些牌用过
double number(char card[])  //把字符串转成double类型
{
    if(strcmp(card, "A")==0)
        return 1;
    else if(strcmp(card, "J")==0)
        return 11;
    else if(strcmp(card, "Q")==0)
        return 12;
    else if(strcmp(card, "K")==0)
        return 13;
    else if(strcmp(card, "joker")==0)
        return 0;
    else if(strcmp(card, "JOKER")==0)
        return 0;
    else
        return atof(card);
}
char* str(double card)  //把double类型转成字符串
{
    if(card == 1)
        return "A";
    else if(card == 11)
        return "J";
    else if(card == 12)
        return "Q";
    else if(card == 13)
        return "K";
    else if(card == 2) return "2";
    else if(card == 3) return "3";
    else if(card == 4) return "4";
    else if(card == 5) return "5";
    else if(card == 6) return "6";
    else if(card == 7) return "7";
    else if(card == 8) return "8";
    else if(card == 9) return "9";
    else if(card == 10) return "10";
    return "";
}
int check(double cards[])   //检查是否存在大小王
{
    for(int i = 0;i < 4;i ++)
    {
        if(cards[i]==0)
            return 0;
    }
    return 1;
}
void dfs(double path1[],char path2[],double count,int num)
{
    if(isDone) return ;
    if(count == 24&&num == 4)   //总数等于24并且用了4张牌,证明找到
    {
//        printf("%s\n",path);
        for(int index = 0;index<3;index ++)
        {
            printf("%s%c",str(path1[index]),path2[index+1]);
       
        printf("%s\n",str(path1[3]));
        isDone = 1;  //作为一个标记是否已找到可以构成24点的
        return;
    }
    for(int i = 0; i < 4 ; i++)
    {
        if(!flag[i])
        {
            flag[i]=1;    //标记这张牌用了
            path1[num] = cards[i];
           
            path2[num] = '+';
            dfs(path1, path2, count + cards[i], num+1);   //dfs加上cards[i]的情况
            if(num > 0)
            {
                path2[num] = '-';
                dfs(path1, path2, count - cards[i], num+1);  //dfs减去cards[i]的情况
               
                path2[num] = '*';
                dfs(path1, path2, count * cards[i], num+1);  //dfs乘以cards[i]的情况
               
                path2[num] = '/';
                dfs(path1, path2, count / cards[i], num+1); //dfs除以cards[i]的情况
            }
            flag[i]=0;   //取消标记,表示放掉这张牌
        }
        if(isDone)
            return ;
    }
}
int main(int argc, const char * argv[])
{

    // insert code here...
    double count,path1[4];    //path1数组用来存储输出的数字
    int num;                //用了多少张扑克牌
    char path2[4];     //path2数组用来存储输出的加减乘除字符
    char firstCard[5],secondCard[5],thirdCard[5],fourthCard[5];
    while(scanf("%s%s%s%s",firstCard,secondCard,thirdCard,fourthCard)!=EOF)
    {
        count = isDone = num =0;
        cards[0] = number(firstCard);
        cards[1] = number(secondCard);
        cards[2] = number(thirdCard);
        cards[3] = number(fourthCard);
        if(!check(cards))
        {
            printf("ERROR\n");
            continue;
        }
        dfs(path1,path2,count,num);
        if(isDone == 0)  //如果等于0,证明没有标记过,则找不到
            printf("NONE\n");
    }
    return 0;
}

java code:
import java.util.Scanner;

public class Main {
    static boolean isDone;
    static int[] cards = new int[4];//存储输入的四张牌
    static boolean[] flag = new boolean[4];//dfs时标记哪些牌用过
    static int number(String card)  //把字符串转成double类型
    {
        if(card.equals("A"))
            return 1;
        else if(card.equals("J"))
            return 11;
        else if(card.equals("Q"))
            return 12;
        else if(card.equals("K"))
            return 13;
        else if(card.equals("joker"))
            return 0;
        else if(card.equals("JOKER"))
            return 0;
        else
            return Integer.parseInt(card);
    }
    static String str(double card)  //把double类型转成字符串
    {
        if(card == 1)
            return "A";
        else if(card == 11)
            return "J";
        else if(card == 12)
            return "Q";
        else if(card == 13)
            return "K";
        else if(card == 2) return "2";
        else if(card == 3) return "3";
        else if(card == 4) return "4";
        else if(card == 5) return "5";
        else if(card == 6) return "6";
        else if(card == 7) return "7";
        else if(card == 8) return "8";
        else if(card == 9) return "9";
        else if(card == 10) return "10";
        return "";
    }
    static boolean check(int cards[])   //检查是否存在大小王
    {
        for(int i = 0;i < 4;i ++)
        {
            if(cards[i]==0)
                return false;
        }
        return true;
    }
    static void dfs(int path1[],String path2[],double count,int num)
    {
        if(isDone) return ;
        if(count == 24 && num == 4)   //总数等于24并且用了4张牌,证明找到
        {
            for(int index = 0;index<3;index ++)
            {
                System.out.print(str(path1[index])+path2[index+1]);
            }
            System.out.println(str(path1[3]));
            isDone = true;  //作为一个标记是否已找到可以构成24点的
            return;
        }
        for(int i = 0; i < 4 ; i++)
        {
            if(!flag[i])
            {
                flag[i]=true;    //标记这张牌用了
                path1[num] = cards[i];
              
                path2[num] = "+";
                dfs(path1, path2, count + cards[i], num+1);   //dfs加上cards[i]的情况
                if(num > 0)
                {
                    path2[num] = "-";
                    dfs(path1, path2, count - cards[i], num+1);  //dfs减去cards[i]的情况
                  
                    path2[num] = "*";
                    dfs(path1, path2, count * cards[i], num+1);  //dfs乘以cards[i]的情况
                  
                    path2[num] = "/";
                    dfs(path1, path2, count / cards[i], num+1); //dfs除以cards[i]的情况
                }
                flag[i]=false;   //取消标记,表示放掉这张牌
            }
            if(isDone)
                return ;
        }
    }

    public static void main(String[] args) {
        double count;
        int[] path1 = new int[4];
        int num;
        String[] path2 = new String[4];
        String firstCard,secondCard,thirdCard,fourthCard;
        Scanner cin = new Scanner(System.in);
       
        while (cin.hasNext()) {
            firstCard = cin.next();
            secondCard = cin.next();
            thirdCard = cin.next();
            fourthCard = cin.next();
            count = 0.0;
            num = 0;
            isDone = false;
            cards[0] = number(firstCard);
            cards[1] = number(secondCard);
            cards[2] = number(thirdCard);
            cards[3] = number(fourthCard);
            if(!check(cards))
            {
                System.out.println("ERROR");
                continue;
            }
            dfs(path1,path2,count,num);
            if(!isDone)  //如果等于false,证明没有标记过,则找不到
                System.out.println("NONE");
           
        }
    }
}</span>


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Go语言(也称为Golang)是由Google开发的一种静态强类型、编译型的编程语言。它旨在成为一门简单、高效、安全和并发的编程语言,特别适用于构建高性能的服务器和分布式系统。以下是Go语言的一些主要特点和优势: 简洁性:Go语言的语法简单直观,易于学习和使用。它避免了复杂的语法特性,如继承、重载等,转而采用组合和接口来实现代码的复用和扩展。 高性能:Go语言具有出色的性能,可以媲美C和C++。它使用静态类型系统和编译型语言的优势,能够生成高效的机器码。 并发性:Go语言内置了对并发的支持,通过轻量级的goroutine和channel机制,可以轻松实现并发编程。这使得Go语言在构建高性能的服务器和分布式系统时具有天然的优势。 安全性:Go语言具有强大的类型系统和内存管理机制,能够减少运行时错误和内存泄漏等问题。它还支持编译时检查,可以在编译阶段就发现潜在的问题。 标准库:Go语言的标准库非常丰富,包含了大量的实用功能和工具,如网络编程、文件操作、加密解密等。这使得开发者可以更加专注于业务逻辑的实现,而无需花费太多时间在底层功能的实现上。 跨平台:Go语言支持多种操作系统和平台,包括Windows、Linux、macOS等。它使用统一的构建系统(如Go Modules),可以轻松地跨平台编译和运行代码。 开源和社区支持:Go语言是开源的,具有庞大的社区支持和丰富的资源。开发者可以通过社区获取帮助、分享经验和学习资料。 总之,Go语言是一种简单、高效、安全、并发的编程语言,特别适用于构建高性能的服务器和分布式系统。如果你正在寻找一种易于学习和使用的编程语言,并且需要处理大量的并发请求和数据,那么Go语言可能是一个不错的选择。
Go语言(也称为Golang)是由Google开发的一种静态强类型、编译型的编程语言。它旨在成为一门简单、高效、安全和并发的编程语言,特别适用于构建高性能的服务器和分布式系统。以下是Go语言的一些主要特点和优势: 简洁性:Go语言的语法简单直观,易于学习和使用。它避免了复杂的语法特性,如继承、重载等,转而采用组合和接口来实现代码的复用和扩展。 高性能:Go语言具有出色的性能,可以媲美C和C++。它使用静态类型系统和编译型语言的优势,能够生成高效的机器码。 并发性:Go语言内置了对并发的支持,通过轻量级的goroutine和channel机制,可以轻松实现并发编程。这使得Go语言在构建高性能的服务器和分布式系统时具有天然的优势。 安全性:Go语言具有强大的类型系统和内存管理机制,能够减少运行时错误和内存泄漏等问题。它还支持编译时检查,可以在编译阶段就发现潜在的问题。 标准库:Go语言的标准库非常丰富,包含了大量的实用功能和工具,如网络编程、文件操作、加密解密等。这使得开发者可以更加专注于业务逻辑的实现,而无需花费太多时间在底层功能的实现上。 跨平台:Go语言支持多种操作系统和平台,包括Windows、Linux、macOS等。它使用统一的构建系统(如Go Modules),可以轻松地跨平台编译和运行代码。 开源和社区支持:Go语言是开源的,具有庞大的社区支持和丰富的资源。开发者可以通过社区获取帮助、分享经验和学习资料。 总之,Go语言是一种简单、高效、安全、并发的编程语言,特别适用于构建高性能的服务器和分布式系统。如果你正在寻找一种易于学习和使用的编程语言,并且需要处理大量的并发请求和数据,那么Go语言可能是一个不错的选择。
Go语言(也称为Golang)是由Google开发的一种静态强类型、编译型的编程语言。它旨在成为一门简单、高效、安全和并发的编程语言,特别适用于构建高性能的服务器和分布式系统。以下是Go语言的一些主要特点和优势: 简洁性:Go语言的语法简单直观,易于学习和使用。它避免了复杂的语法特性,如继承、重载等,转而采用组合和接口来实现代码的复用和扩展。 高性能:Go语言具有出色的性能,可以媲美C和C++。它使用静态类型系统和编译型语言的优势,能够生成高效的机器码。 并发性:Go语言内置了对并发的支持,通过轻量级的goroutine和channel机制,可以轻松实现并发编程。这使得Go语言在构建高性能的服务器和分布式系统时具有天然的优势。 安全性:Go语言具有强大的类型系统和内存管理机制,能够减少运行时错误和内存泄漏等问题。它还支持编译时检查,可以在编译阶段就发现潜在的问题。 标准库:Go语言的标准库非常丰富,包含了大量的实用功能和工具,如网络编程、文件操作、加密解密等。这使得开发者可以更加专注于业务逻辑的实现,而无需花费太多时间在底层功能的实现上。 跨平台:Go语言支持多种操作系统和平台,包括Windows、Linux、macOS等。它使用统一的构建系统(如Go Modules),可以轻松地跨平台编译和运行代码。 开源和社区支持:Go语言是开源的,具有庞大的社区支持和丰富的资源。开发者可以通过社区获取帮助、分享经验和学习资料。 总之,Go语言是一种简单、高效、安全、并发的编程语言,特别适用于构建高性能的服务器和分布式系统。如果你正在寻找一种易于学习和使用的编程语言,并且需要处理大量的并发请求和数据,那么Go语言可能是一个不错的选择。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值