黑马程序员------24点游戏
来源:互联网 发布:楚楚街和淘宝 编辑:程序博客网 时间:2024/05/13 18:08
------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#includeint 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>
- 黑马程序员------24点游戏
- 黑马程序员_OC点语法
- [黑马程序员][OC]点语法
- 黑马程序员-OC-点语法
- 黑马程序员--OC-点语法
- 黑马程序员-------OC----点语法
- 黑马程序员-String那点事
- 黑马程序员----xaml基础点01
- 黑马程序员_OC中的点语法
- 黑马程序员_OC学习之点语法
- 黑马程序员 之 Objective-C 点语法
- 黑马程序员—高新知识点复习
- 黑马程序员Objective-C笔记:点语法
- 黑马程序员 oc随机 点语法
- 24点游戏代码
- 24点游戏
- 24点扑克牌游戏
- 24点游戏
- ssh 登录免密码设置
- C语言及程序设计提高例程-12 变量的存储类别
- C语言及程序设计提高例程-16 数组的引入
- C语言及程序设计提高例程-15 小小型应用系统开发指导(三)
- C语言及程序设计提高例程-14 应用系统结构
- 黑马程序员------24点游戏
- C语言及程序设计提高例程-18 一维数组应用二三例
- 3WordPress的内容管理
- 1017. A除以B (20)
- iOS 添加Cordova到已存在的Xcode 工程里
- HDU 2102 A计划
- 排水沟(Drainage Ditches)——最大流水题
- 工作中遇到的shell脚本知识(4)
- 【java编程】String之字符串反转