最優程序問題

劉汝佳白書7-1最優程序問題大致實現

#include <iostream>

using namespace std;
#define ADD 0
#define SUB 1
#define MUL 2
#define DIV 3
#define DUP 4
#define MAX_SIZE 100

struct Node 
{
  int value;			//存儲code所有指令執行後棧頂的值
  char code[MAX_SIZE];	//存儲從根到本節點的所有指令操作代碼
  int len;		//記錄code長度即指令個數
  int parent;	//記錄父節點
  int top;	//記錄code所有指令執行後棧中的數據個數
};
Node q[MAX_SIZE*MAX_SIZE];
void print(Node& instr)
{
	for(int i=0; i<instr.len; i++)
	{
		switch(instr.code[i])
		{
			case ADD:printf("ADD\t");break;
			case SUB:printf("SUB\t");break;
			case MUL:printf("MUL\t");break;
			case DIV:printf("DIV\t");break;
			case DUP:printf("DUP\t");break;
		}
	}
	printf("\n");
}
//計算到一個節點的所有指令並返回棧頂值
int calc(Node& instr,int a)
{
	int x1,x2;
	char* code=instr.code;
	int	  stack[MAX_SIZE]={0},top=-1;
	stack[++top]=a;
	if(instr.len>=MAX_SIZE) return 0;
	for(int i=0; i<instr.len; i++)
	{
	switch(code[i])
	{
		case ADD:
			x1=stack[top--];
			x2=stack[top--];
			stack[++top]=x1+x2;
			break;
		case SUB:
			x1=stack[top--];
			x2=stack[top--];
			stack[++top]=x2-x1;
			break;
		case MUL:
			x1=stack[top--];
			x2=stack[top--];
			stack[++top]=x1*x2;
			break;
		case DIV:
			x1=stack[top--];
			x2=stack[top--];
			stack[++top]=x2/x1;
			break;
		case DUP:
			x1=stack[top--];
			stack[++top]=x1;
			stack[++top]=x1;
			break;
	}
	}
	return stack[top];
}
int bfs(int a,int b) 
{
	int front=0,rear=1, result=0;
	//q[front]=Node(a, DUP,1, -1);
	//入隊一個DUP操作
	q[front].code[0]=DUP;q[front].len=1;q[front].parent=-1;q[front].top=1;q[front].value=a;
	calc(q[front],a);q[front].top+=1;
	while(front<rear&&rear<MAX_SIZE*MAX_SIZE)
	{
		Node& pre=q[front];
		for(int i=ADD; i<=DUP; i++)
		{
			if(i!=DUP&&pre.top<2)//如果棧數據個數小於2則無法執行ADD SUB...等操作
				continue;
			else
			{
				if(i==DIV&&calc(pre,a)==0) //檢測除數爲0則放棄DIV操作
						continue;
				//生成一個包含新指令加入後執行結果的節點
				Node& cur=q[rear];memcpy(&cur,&pre,sizeof(Node));cur.code[cur.len]=i;cur.len++;cur.parent=front;cur.value=calc(cur,a);
				if(cur.value>30000 || cur.value<-30000) 
					continue;
				if(i==DUP) cur.top+=1; else cur.top-=1;	//調整棧數據個數
				rear++;//入隊
				if(cur.top==1&&cur.value==b)//找到答案
				{
					print(cur);//return rear-1;
					return 1;
				}
			}
		}
		front++;
	}
	return 0;
}

int main() 
{
  bfs(11,17435);   //求從整數11經過最短的ADD SUB MUL DIV DUP操作得到結果17435的指令序列
  system("pause");
  return 0;
}


發佈了59 篇原創文章 · 獲贊 1 · 訪問量 7萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章