1.输入输出约定

输入四个字符,分别代表四个扑克牌,约定:0字符为10,JQK分别为11 12 13.

输出运算过程,如果没有无解,输出 no ans.

2.运行截图

(1)有答案的

(2)无答案的

3.算法思路步骤

(1)输入四个字符,例如:2 6 J 0

(2)将字符转化为整数,其中0JQK分别转化为10 11 12 13

(3)使用深度优先算法,为4张牌排序

(4)对于每种排序方式,使用不同的运算符相连接,例如2 * 6 + 11- 10

(5)对于每种排序方式的每种运算符连接,分别考察两种计算方式

(6)第一种计算方式为瀑布式,例如:(((2*6)+11)-10)

(7)第二种计算方式为合并式,例如:(2*6)+(11-10)

(8)如果答案等于24,则输出运算过程

4.完整代码

#include<iostream>
#include<stack>
using namespace std;bool isSort[4]; //牌是否使用
stack<int> mySort; //牌的次序
stack<int> copySort; //牌的次序的复制
int haveAns=0; //有多少个解法
int symbol[3]; //运算符号
int cardData[4]; //牌的数据
int ansSum=0; //游戏答案总数 /*
展示运算过程type:1 滚雪球运算法,2 分别运算后再运算
*/
void showAns(int type){haveAns++;if(type==1){cout<<"((( "<<cardData[0]<<" ";for(int i=0;i<3;i++){if(symbol[i]==0) cout<<"+"<<" ";if(symbol[i]==1) cout<<"-"<<" ";if(symbol[i]==2) cout<<"*"<<" ";if(symbol[i]==3) cout<<"/"<<" ";cout<<cardData[i+1]<<" ) ";}   }if(type==2){cout<<"( "<<cardData[0]<<" ";for(int i=0;i<3;i++){if(symbol[i]==0) cout<<"+"<<" ";if(symbol[i]==1) cout<<"-"<<" ";if(symbol[i]==2) cout<<"*"<<" ";if(symbol[i]==3) cout<<"/"<<" ";if(i==0||i==2) cout<<cardData[i+1]<<" ) ";if(i==1) cout<<"( "<<cardData[i+1]<<" ";}   }cout<<endl;cout<<endl;
}/*
计算过程x:第一个数
t: 运算符 0+ 1- 2* 3/
y:第二个数 return:答案
*/
int calculate(int x,int t,int y){if(x==-1||y==-1) return -1;if(t==0) return x+y;if(t==2) return x*y;if(t==1){if(x-y<0) return -1;return x-y;} if(t==3){if(y==0||x%y!=0) return -1;return x/y;}
} /*
分支运算法分别按照运算符算前两个数和后两个数,再将结果运算
*/
void checkMergeOK(){int left,right;left=calculate(cardData[0],symbol[0],cardData[1]);right=calculate(cardData[2],symbol[2],cardData[3]);left=calculate(left,symbol[1],right);if(left==24) showAns(2);
}/*
滚雪球运算法以第一个数为起点,依次按对应运算符计算
*/
void checkSnowballOK(){int ans=cardData[0];for(int i=0;i<3;i++){ans=calculate(ans,symbol[i],cardData[i+1]);}if(ans==24) showAns(1);
}/*
遍历所有运算符情况
*/
void checkOK(){for(int i=0;i<4*4*4;i++){symbol[0]=i/16;symbol[1]=(i/4)%4;symbol[2]=i%4;//  cout<<symbol[0]<<" "<<symbol[1]<<" "<<symbol[2]<<endl;copySort=mySort;int iIndex=0;while(!copySort.empty()){cardData[iIndex]=copySort.top();iIndex++;copySort.pop();}//cout<<cardData[0]<<" "<<cardData[1]<<" "<<cardData[2]<<" "<<cardData[3]<<endl;checkSnowballOK();checkMergeOK();}/*if(haveAns>0){ansSum++;cout<<cardData[0]<<" "<<cardData[1]<<" "<<cardData[2]<<" "<<cardData[3]<<endl;haveAns=0;}*/return;
} /*
四个卡牌的次序排序,使用深度优先排序
*/
void dfsCardSort(int *yyx,int indexP){if(indexP==4){checkOK();return;}for(int i=0;i<4;i++){if(!isSort[i]){isSort[i]=true;mySort.push(yyx[i]);//    cout<<yyx[i]<<endl;dfsCardSort(yyx,indexP+1);mySort.pop();isSort[i]=false;}}
}/*
输入四个卡牌卡牌的值,去计算是否可以正确运算
*/
bool toAns(int q1,int q2,int q3,int q4){int yyx[4]={q1,q2,q3,q4};dfsCardSort(yyx,0);if(haveAns) return true;else return false;
}/*
将卡牌转化为数字,其中0对应10,JQK分别对应11 12 13
*/
bool toInt(char s1,char s2,char s3,char s4){int q1,q2,q3,q4;if(s1>'0'&&s1<='9'){q1=s1-'0';}else{if(s1=='0') q1=10;if(s1=='J') q1=11;if(s1=='Q') q1=12;if(s1=='K') q1=13;}if(s2>'0'&&s2<='9'){q2=s2-'0';}else{if(s2=='0') q2=10;if(s2=='J') q2=11;if(s2=='Q') q2=12;if(s2=='K') q2=13;}if(s3>'0'&&s3<='9'){q3=s3-'0';}else{if(s3=='0') q3=10;if(s3=='J') q3=11;if(s3=='Q') q3=12;if(s3=='K') q3=13;}if(s4>'0'&&s4<='9'){q4=s4-'0';}else{if(s4=='0') q4=10;if(s4=='J') q4=11;if(s4=='Q') q4=12;if(s4=='K') q4=13;}
//  cout<<q1<<" "<<q2<<" "<<q3<<" "<<q4;if(!toAns(q1,q2,q3,q4)) return false;else return true;
}int main(){char s1,s2,s3,s4;while(cin>>s1>>s2>>s3>>s4){haveAns=0;cout<<endl;cout<<"答案为:"<<endl; cout<<endl;if(!toInt(s1,s2,s3,s4)) cout<<"no ans"<<endl;}
/*   for(int i=0;i<13*13*13*13;i++){cardData[0]=i%13+1;cardData[1]=(i/13)%13+1;cardData[2]=(i/13/13)%13+1;cardData[3]=(i/13/13/13)%13+1;checkOK();}cout<<"有多少个解?"<<ansSum;*/return 0;
}

-------------------------------------

尊敬的开发者,您好!我是一名初入职场的小小程序员,从事软件开发工作,定期发一些文章来记录自己的学习过程,并分享问题的解决方法。

如果样例代码和文章描述有哪些问题,或者有相关领域想一起讨论,欢迎私信交流。

用代码来玩三八二十四扑克牌游戏(C++)相关推荐

  1. 【Visual C++】游戏开发五十七 浅墨DirectX教程二十四 打造游戏GUI界面(二)

    本系列文章由zhmxy555(毛星云)编写,转载请注明出处. 文章链接: http://blog.csdn.net/poem_qianmo/article/details/16922703 作者:毛星 ...

  2. JavaWeb开发与代码的编写(二十四)

    JavaWeb开发与代码的编写(二十四) JNDI数据源的配置 数据源的由来 在Java开发中,使用JDBC操作数据库的四个步骤如下: ①加载数据库驱动程序(Class.forName("数 ...

  3. 【Microsoft Azure 的1024种玩法】二十四.通过Azure Front Door 的 Web 应用程序防火墙来对 OWASP TOP 10 威胁进行防御

    [简介] 我们都知道像 SQL 注入.跨站点脚本攻击(XSS)之类的恶意攻击以及 OWASP 发现的十大威胁都可能会导致服务中断或数据丢失,让 Web 应用程序所有者受到巨大威胁.那么如何有效的解决O ...

  4. python 分数序列求和公式_Python分数序列求和,编程练习题实例二十四

    本文是关于Python分数序列求和的应用练习,适合菜鸟练习使用,python大牛绕行哦. Python练习题问题如下: 问题简述:有一分数序列:2/1,3/2,5/3,8/5,13/8,21/13 要 ...

  5. 异常处理程序和软件异常——Windows核心编程学习手札之二十四

    异常处理程序和软件异常 --Windows核心编程学习手札之二十四 CPU负责捕捉无效内存访问和用0除一个数值这种错误,并相应引发一个异常作为对错误的反应,CPU引发的异常称为硬件异常(hardwar ...

  6. 数字图像处理领域的二十四个典型算法及vc实现、第一章

    数字图像处理领域的二十四个典型算法及vc实现.第一章 作者:July   二零一一年二月二十六日. 参考:百度百科.维基百科.vc数字图像处理. --------------------------- ...

  7. 山海演武传·黄道·第一卷 雏龙惊蛰 第二十二 ~ 二十四章 真龙之剑·星墟列将...

    山海演武传·黄道·第一卷 雏龙惊蛰 第二十二 ~ 二十四章 真龙之剑·星墟列将 "我是第一次--请你,请你温柔一点--"少女一边娇喘着,一边将稚嫩的红唇紧贴在男子耳边,樱桃小嘴盈溢 ...

  8. [系统安全] 二十四.逆向分析之OllyDbg调试INT3断点、反调试、硬件断点与内存断点

    您可能之前看到过我写的类似文章,为什么还要重复撰写呢?只是想更好地帮助初学者了解病毒逆向分析和系统安全,更加成体系且不破坏之前的系列.因此,我重新开设了这个专栏,准备系统整理和深入学习系统安全.逆向分 ...

  9. SAP UI5 初学者教程之二十四 - 如何使用 OData 数据模型试读版

    一套适合 SAP UI5 初学者循序渐进的学习教程 教程目录 SAP UI5 本地开发环境的搭建 SAP UI5 初学者教程之一:Hello World SAP UI5 初学者教程之二:SAP UI5 ...

最新文章

  1. 数字图像处理——第五章 图像复原与重建
  2. 【Linux入门到精通系列讲解】Nginx详细介绍和安装使用(这一篇就够了)
  3. matlab读取h5文件
  4. SQLyog连接Mysql8.0提示 Authentication plugin ‘caching_sha2_password‘ cannot be loaded
  5. Mysql索引类型分析
  6. 语音合成与识别技术在C#中的应用 (转 )
  7. html 像素跟百分比,html – 将百分比宽度与边距(以像素为单位)组合起来
  8. ios依赖管理工具:Carthage
  9. 未定义标识符 stringc/c++(20)_拓展巩固练习(2020.5.20)
  10. struts2登录注册示例_Struts 2控制标签示例教程
  11. cobbler自动化系统安装
  12. “年少当攀第一流,恰如明月冠中秋”
  13. arcgis矢量文件计算多个同类属性面积总和
  14. 学习嵌入式Linux开发——RK3288开发板学习规划及目标
  15. 北斗导航 | ION GNSS+ 2014到 ION GNSS+ 2017会议论文下载:ION 美国导航学会
  16. Maxima解方程的一点收获
  17. linux添加五笔输入法,在Ubuntu16.04中为fctix小企鹅增加五笔输入法
  18. UnicodeDecodeError: ‘gbk‘ codec can‘t decode byte 0xae in position 16: illegal multibyte sequence
  19. GoLand/GO项目配置与使用
  20. mysql 1025_ERROR 1025 (HY000): Error on rename of to

热门文章

  1. Android上实现高并发,可延迟处理
  2. 微信小程序中遇到的多规格问题(一)
  3. C++——std::async和std::thread
  4. 【Latex】引用文献时et al缺少逗号
  5. 单片机ESP8266智能家居的红外遥控设计 C源代码+原理图+PCB 全设计资料
  6. python爬取携程网机票信息
  7. Nature:重磅!人类一生中的脑图形态变化
  8. jdk下载过程中显示“以下应用程序正在使用需要由此安装程序更新的文件”
  9. 3D AOI/SPI技术, 3D自动光学检测/锡膏检测技术
  10. 写给电子工程师的,非常值得一看