劉汝佳白書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;
}