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;
计算结果:(注意输入的算式的格式)



0 0