运算符重载之火柴棒问题

题目:
用火柴棒摆成的0-9间的数字,横向由一根火柴构成,纵向都是由两根火柴构成,
可按如下规则进行变化:
1.数字移动一根火柴棒可变成其它0到9之间合法的数字
2.数字添加一根火柴棒可变成其它0到9之间合法的数字
3.数字去掉一根火柴棒可变成其它0到9之间合法的数字
现在给出一个带有两个操作数的+,-,*,/的算术式子,需要你判断该式子是否
成立,如给出式子9-6=3,这个符合正常结果,正确;如给出式子
9-6=2,其判断规则如下:
1.变换左操作数可以使式子成立的话,打印出来变化后的算术等式
2.变换右操作数可以使式子成立的话,打印出来变化后的算术等式
3.变化左右操作数可以使式子成立的话,打印出来变化后的算术等式
4.以上变化都无法让等式成立,打印等式无法成立
完成代码注意事项:
1.请用C++面向对象语言来完成代码书写,书写代码要依
据编程规范,代码质量和代码功能实现各占一半的分数。

 

2.不考虑负数的情况

 

方案一:使用map表存储

 

#include <vector>
#include <iterator>
#include <map>
#include <iostream>
using namespace std;

static map<int,vector<int>>initmap()
{
	map<int,vector<int>> mymap;
	vector<int> vec;
	vec.push_back(8);
	vec.push_back(6);
	vec.push_back(9);
	mymap[0]=vec;
	vec.clear();

	vec.push_back(7);
	mymap[1]=vec;
	vec.clear();

	vec.push_back(3);
	mymap[2]=vec;
	vec.clear();

	vec.push_back(9);
	vec.push_back(2);
	vec.push_back(5);
	mymap[3]=vec;
	vec.clear();

	mymap[4]=vec;
	vec.clear();

	vec.push_back(6);
	vec.push_back(9);
	vec.push_back(3);
	mymap[5]=vec;
	vec.clear();

	vec.push_back(8);
	vec.push_back(5);
	vec.push_back(9);
	vec.push_back(0);
	mymap[6]=vec;
	vec.clear();

	vec.push_back(1);
	mymap[7]=vec;
	vec.clear();

	vec.push_back(6);
	vec.push_back(9);
	vec.push_back(0);
	mymap[8]=vec;
	vec.clear();

	vec.push_back(8);
	vec.push_back(3);
	vec.push_back(5);
	vec.push_back(6);
	vec.push_back(0);
	mymap[9]=vec;
	vec.clear();

	return mymap;
}

class CMatch
{
public:
	void parse(char *input)
	{
		char *p = input;

		mleft = *p-'0';
		p++;
		msign = *p;
		p++;
		mright = *p-'0';
		p++;
		p++;
		mresult = *p-'0';
		//cout<<mleft<<msign<<mright<<"="<<mresult<<endl;
	}
	int makeResult(int left, char sign, int right)
	{
		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 result = 0;
		result = makeResult(mleft, msign, mright);

		if(mresult == result)
		{
			cout<<"no change!"<<endl;
			cout<<mleft<<msign<<mright<<"="<<result<<endl;
			return;
		}
		else
		{
			map<int,vector<int>>::iterator it;
			vector<int> vec_left;
			vector<int> vec_right;

			for (it = mmap.begin();it != mmap.end();++it)
			{
				if(mleft == it->first)
				{
					vec_left = it->second;
					for (vector<int>::iterator vecit = vec_left.begin();vecit != vec_left.end();++vecit)
					{
						if (makeResult(*vecit, msign, mright) == mresult)
						{
							cout<<"change left number success!"<<endl;
							cout<<*vecit<<msign<<mright<<"=" <<mresult<<endl;
							return ;
						}
					}
				}
			}

			for (it = mmap.begin();it != mmap.end();++it)
			{
				if(mright == it->first)
				{
					vec_right = it->second;

					for (vector<int>::iterator vecit = vec_right.begin();vecit != vec_right.end();++vecit)
					{
						
						if (makeResult(mleft, msign, *vecit) == mresult)
						{
							cout<<"change right number success!"<<endl;
							cout<<mleft<<msign<<*vecit<<"=" <<mresult<<endl;
							return ;
						}
					}
				}
			}

			bool flag_left = false;
			bool flag_right = false;
			for (it = mmap.begin();it != mmap.end();++it)
			{
				if(mleft == it->first)
				{
					vec_left = it->second;
					flag_left = true;
				}
				if(mright == it->first)
				{
					vec_right = it->second;
					flag_right = true;
				}

				if(flag_left && flag_right)
				{
					for (vector<int>::iterator vec_left_it = vec_left.begin();vec_left_it != vec_left.end();++vec_left_it)
					{
						for (vector<int>::iterator vec_right_it = vec_right.begin();vec_right_it != vec_right.end();++vec_right_it)
						{
							if (makeResult(*vec_left_it, msign, *vec_right_it) == mresult)
							{
								cout<<"change left and right number success!"<<endl;
								cout<<*vec_left_it<<msign<<*vec_right_it<<"=" <<mresult<<endl;
								return ;
							}
						}
					}
				}

			}

		}
		cout<<"no valid change!"<<endl;
	}
	
private:
	int mleft;
	int mright;
	char msign;
	int mresult;
	static map<int,vector<int>> mmap;
};

map<int,vector<int>> CMatch::mmap = initmap();

int main()
{
	CMatch match;
	cout<<"input string:"<<endl;
	char buffer[1024]={0};
	cin>>buffer;  
	match.parse(buffer);
	match.match();
	
	return 0;
}

 

 

方案二:使用二维数组

 

#include <iostream>
using namespace std;

class CInt
{
public:
	CInt(int num=0):mvalue(num){}
	void setValue(int value)
	{
		mvalue = value;
	}
	void beginChange()
	{
		mindex = 0;
	}
	bool bcanChange()
	{
		return mNumMap[mvalue][mindex] != -1;
	}
	int nextValue()
	{
		return mNumMap[mvalue][mindex++];
	}
	operator int(){return mvalue;}
private:
	int mvalue;//真实值
	int mindex;//对应变换值的索引
	static int mNumMap[10][10];//变换表
	friend ostream& operator<<(ostream &out, const CInt &intObj);
};
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:
	void parse(char *input)
	{
		char *p = input;

		mleft.setValue(*p-'0');
		p++;
		msign = *p;
		p++;
		mright.setValue(*p-'0');
		p++;
		p++;
		mresult.setValue(*p-'0');
		//cout<<mleft<<msign<<mright<<"="<<mresult<<endl;
	}
	int makeResult(int left, char sign, int right)
	{
		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<<"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;
	char buffer[1024]={0};
	cin>>buffer;   // cin>>scanf  "hello world"   gets()  cin.getline()
	match.parse(buffer);
	match.match();
	return 0;
}


此处运行结果不再粘贴,使用map表手动进行数据存储时,代码过于繁琐,此种情况,使用二维数组更为清晰明了。

 

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章