攻城狮凌风

算法学习(1)枚举法求运算符

输入ABCDE 5个数,结果Result。寻找所有的运算符组合填充至5个数之间,使得下式成立
                                  A B C D E==Result

枚举法需要满足的条件:

      1.阈值候选答案的数量

      2.候选答案求解前必须有确定集合

解决方案

#include"iostream"
using namespace std;
void print(int num[5],int Operator[4],int answer)//输出某个解决方案
{
	int i=0;
	char index[4]={'+','-','*','/'};
	cout<<num[0];
	while(i<4)
	  {cout<<index[Operator[i]];cout<<num[i+1];i++;}
	cout<<"="<<answer<<endl;
}
void findSolution(int num[5],int answer)//嵌套循环遍历所有的解决方案
{
	int count=0;//计数
	int flag;//1=+,-1=-
	int Operator[4];
	double left,right;//切记此处一定定义为double
	for(Operator[0]=0;Operator[0]<4;Operator[0]++)
		if(Operator[0]<3||num[1]!=0)
		  for(Operator[1]=0;Operator[1]<4;Operator[1]++)
			if(Operator[1]<3||num[2]!=0)
			  for(Operator[2]=0;Operator[2]<4;Operator[2]++)
				if(Operator[2]<3||num[3]!=0)							
				 for(Operator[3]=0;Operator[3]<4;Operator[3]++)
					if(Operator[3]<3||num[4]!=0)
					  {left=0;right=num[0];flag=1;
						for(int i=0;i<4;i++)
						{
							switch(Operator[i])
							{
							        case 0:
									 left=left+flag*right;//运算的是当前符号之前2个数
									 right=num[i+1];//保存当前符号
									 flag=1;
									 break;
								case 1:
									left=left+flag*right;//运算的是当前符号的前2个数
									right=num[i+1];
									flag=-1;//保存当前符号,在后序操作有优先运算符的时候起作用
									break;
								case 2:
									right=right*num[i+1];
									break;
								case 3:
									 right=right/num[i+1];
									 break;
							}
						}
					    if(left+flag*right==answer)
					          {count++;cout<<count<<":";print(num,Operator,answer);}
	               }
	if(count)
	     cout<<"总共有"<<count<<"种方案"<<endl;
	else
		cout<<"无有效解决方案,请重新输入"<<endl;
}
int _tmain(int argc, _TCHAR* argv[])
{
	cout<<"输入6个数,最后一个数为目标结果"<<endl;
	int num[5];
	int answer;
    for(int i=0;i<5;i++) cin>>num[i];
	cin>>answer;
	findSolution(num,answer);
	return 0;
}

分析:

    1.以0,1,2,3代表加减乘除进行4嵌套循环     2.当运算符为/时保证最后一个数不为0     3.当前符号为*或/时,直接计算     4.当前符号为+,-时,进行前一个+或-操作     5 left,right分别保存上次运算左侧的结果(下次运算左侧的内容)和下次运算右侧的结果(下次运算右侧的内容)。

   

posted on 2014-09-07 21:55  攻城狮凌风  阅读(256)  评论(0编辑  收藏  举报

导航