c++火柴棒问题
来源:互联网 发布:sql镜像服务器 编辑:程序博客网 时间:2024/06/10 17:19
题目:
1.火柴棒问题
用火柴棒摆成的0-9间的数字,横向由一根火柴构成,纵向都是由两根火柴构成,
可按如下规则进行变化:
1.数字移动一根火柴棒可变成其它0到9之间合法的数字
2.数字添加一根火柴棒可变成其它0到9之间合法的数字
3.数字去掉一根火柴棒可变成其它0到9之间合法的数字
现在给出一个带有两个操作数的+,-,*,/的算术式子,需要你判断该式子是否
成立,如给出式子9-6=3,这个符合正常结果,正确;如给出式子
9-6=2,其判断规则如下:
1.变换左操作数可以使式子成立的话,打印出来变化后的算术等式
2.变换右操作数可以使式子成立的话,打印出来变化后的算术等式
3.变化左右操作数可以使式子成立的话,打印出来变化后的算术等式
4.以上变化都无法让等式成立,打印等式无法成立
不考虑负数的情况
思路:
首先,面向对象的思想,要看情景把实体进行抽象并确定成员对象和成员方法,搭一个基本框架,再考虑函数怎么写?
实体一:数字
成员变量:原数 变换后的数(二维数组存储,与原数对应) 下标(标志变换数的起始下标)
成员函数:void setvalue(int value) 初始化match类的成员变量Cint类(因为不能访问CInt的私有成员变量)
void beginChange() 开始变换
bool bcanChange()可变换的数为-1时表示不能再变换
int nextValue() 取出变换成的数
实体二:匹配类
成员变量: CInt left(左操作数), CIn right, char sigh, CInt result,
成员函数:
parse 解析输入的算式
getResult 计算变换数字前后的结果
match 变换 匹配
下面贴代码:
#include <iostream>using namespace std;#include<string>////=======================火柴棒问题==========================////思路 每一个数字增添 去掉 移动一根火柴棒变成其他数字存到一个结构体中,不能变换的存-1;// 0 1 2 3 4 5 6 7 8 9//柴棒根数 6 2 5 5 4 5 6 3 7 6//规律:// 增加 去掉 移动 //0 8 * 6 9//1 7 * *//2 * * 3 //3 9 * 2 5//4 * * * //5 6 9 * 3 //6 8 5 9 0 //7 * 1 *//8 * 9 6 0 *//9 8 5 3 6 0//场景//实体 => 抽象 属性 行为//数字//存储变换数字的数据结构map key vector 二维数组class CInt{public:void setvalue(int value){mvalue = value;}void beginChange(){index = 0;}bool bcanChange(){return mNumMap[mvalue][index] != -1;}int nextValue(){return mNumMap[mvalue][index++];}operator int(){return mvalue;}//int类型转换private:int mvalue;static int mNumMap[10][10];int index;friend ostream& operator<<(ostream &out, const CInt &intObj);//static vector<vector<int>> _changmap;//map<int ,vector<int>>;};//数字变换的映射表 二维数组int CInt::mNumMap[10][10]={{6,8,9,-1},{7,-1},{3,-1},{2,5,9,-1},{-1},{3,6,9,-1},{0,5,8,9,-1},{1,-1},{0,6,9,-1},{0,3,5,6,8,-1},};ostream& operator<<(ostream &out, const CInt &intObj){out<<intObj.mvalue;return out;}class CMatch//匹配类{public://算式解析(string)//计算需要数字,用数字构造CInt类的对象void parse(char *input){//9-3=6;char *p = input;//mleft.mvalue = *p-'0';//无法访问 private 成员(在“CInt”类中声明)mleft.setvalue(*p-'0');//提供set成员函数p++;msign = *p;p++;mright.setvalue(*p-'0');p++;p++;mresult.setvalue(*p-'0');}//计算输入的算式的结果 与等式右边比较,判断对错int makeResult(int left, char sign, int right)//也可以传入CInt对象,提供+/-/*/\运算符重载函数 {switch(sign){case '+':return left+right;case '-':return left-right;case '*':return left*right;case '/':return left/right;default:throw "invalid sign!";break;}}void match(){int value = 0;int result = 0;result = makeResult(mleft, msign, mright);if(mresult == result){cout<<"is right,no change!"<<endl;cout<<mleft<<msign<<mright<<"="<<result<<endl;return;}mleft.beginChange();while(mleft.bcanChange()){value = mleft.nextValue();result = makeResult(value, msign, mright);if(mresult == result){cout<<"change left number success!"<<endl;cout<<value<<msign<<mright<<"="<<result<<endl;return;}}mright.beginChange();while(mright.bcanChange()){value = mright.nextValue();result = makeResult(mleft, msign, value);if(mresult == result){cout<<"change right number success!"<<endl;cout<<mleft<<msign<<value<<"="<<result<<endl;return;}}int leftval = 0;int rightval = 0;mleft.beginChange();while(mleft.bcanChange()){leftval = mleft.nextValue();mright.beginChange();while(mright.bcanChange()){rightval = mright.nextValue();result = makeResult(leftval, msign, rightval);if(mresult == result){cout<<"change left and right number success!"<<endl;cout<<leftval<<msign<<rightval<<"="<<result<<endl;return;}}}cout<<"no valid change!"<<endl;}private:CInt mleft;CInt mright;char msign;CInt mresult;};int main(){CMatch match;cout<<"input string"<<endl;//gets//cin.getline();char buff[278] = {0};cin>>buff;match.parse(buff);match.match();return 0;}//vector<vector<int>>CInt::_changmap;计算结果:(注意输入的算式的格式)
- c++火柴棒问题
- 火柴问题
- C 语言程序设计实践 3.14 摆火柴棒
- 国色天香(火柴,c++)
- baofeng 火柴问题
- 轮流拾取火柴问题
- 移动火柴问题
- 火柴问题 +全排列
- 100根火柴问题
- 青科大编程赛热身赛C题:火柴棒等式
- C语言程序设计实验题3.14摆火柴棒
- 运算符重载笔试题——火柴棒问题
- c语言题---火柴棍
- Nim与取火柴问题
- XYNUOJ 问题 F: 火柴字
- [NOIP2008]火柴棒等式
- 1766. 火柴棒等式
- [NOIP2008] 火柴棒等式
- POj 3819 Coverage 已被翻译
- BZOJ 1878, HH的项链
- ubnutu环境变量设置和sublime环境设置
- VC++ CEdit 和 CComboBox类 的使用
- 1月18日(作业)
- c++火柴棒问题
- Storm教程2安装部署
- Mybatis学习总结(六).Mybatis高级查询及延迟加载
- 站在巨人的肩上——Android热更新框架Tinker探索之旅
- PX4源码分析2_QGC地面站的下载和安装
- HDU4511
- 用 Python 编写网络爬虫 笔记
- 数据结构简单选择排序
- WebService 及java网络编程等基础概念(一)