| ||||||||||
| Online Judge | Problem Set | Authors | Online Contests | User | ||||||
|---|---|---|---|---|---|---|---|---|---|---|
| Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest | |||||||||
高手们帮忙看看吧1480~~WA 我是用DFS做的 代码比较好读#define INFINIT 20
#include <iostream>
using namespace std;
int stack[12],stack_ptr;
int iarray[10][2],isum_array,isum_cmd,imin_cmd;
char cmd[12],mincmd[12];
char cmdbase[8]={'A','S','M','D','C'};
int evaluate(void)
//check for feasibility
{
int i,j,state(1);
for(i=0;i<isum_array;++i)
{
stack[stack_ptr=0]=iarray[i][0];
for(j=0;j<isum_cmd;++j)
{
switch(cmd[j])
{
case 'A':
{
if(0==stack_ptr)
return -1;
--stack_ptr;
stack[stack_ptr]+=stack[stack_ptr+1];
}
break;
case 'S':
{
if(0==stack_ptr)
return -1;
--stack_ptr;
stack[stack_ptr]-=stack[stack_ptr+1];
}
break;
case 'M':
{
if(0==stack_ptr)
return -1;
--stack_ptr;
stack[stack_ptr]*=stack[stack_ptr+1];
}
break;
case 'D':
{
if(0==stack_ptr||0==stack[stack_ptr])
return -1;
--stack_ptr;
stack[stack_ptr]/=stack[stack_ptr+1];
}
break;
case 'C':
{
stack[stack_ptr+1]=stack[stack_ptr];
++stack_ptr;
}
}
if(stack[stack_ptr]>30000||stack[stack_ptr]<-30000)
return -1;
}
if(stack[stack_ptr]!=iarray[i][1])
state=0;
}
return state;
}
void dfs(int index)
//isum_cmd is a global var for evaluate()
{
int i,j,state;
isum_cmd=index;
if(index>10)
return;
if(isum_cmd>=imin_cmd)
return;
state=evaluate();
if(1==state)
{
if(isum_cmd<imin_cmd)
{
imin_cmd=isum_cmd;
for(i=0;i<isum_cmd;++i)
mincmd[i]=cmd[i];
}
return;
}
else if(-1==state)
return;
isum_cmd=index+1;
if(isum_cmd>=imin_cmd||isum_cmd>10)
return;
for(i=0;i<5;++i)
{
cmd[index]=cmdbase[i];
dfs(index+1);
}
}
int main(void)
{
int round(0),i;
while(++round)
{
cin>>isum_array;
if(0==isum_array)break;
if(round>1)
cout<<endl;
cout<<"Program "<<round<<endl;
for(i=0;i<isum_array;++i)
cin>>iarray[i][0];
for(i=0;i<isum_array;++i)
cin>>iarray[i][1];
isum_cmd=0;
imin_cmd=INFINIT;
dfs(0);
if(imin_cmd<INFINIT)
{
if(0==imin_cmd)
cout<<"Empty sequence";
else
for(i=0;i<imin_cmd;++i)
{
if(i)
cout<<" ";
switch(mincmd[i])
{
case 'A':
{
cout<<"ADD";
break;
}
case 'S':
{
cout<<"SUB";
break;
}
case 'M':
{
cout<<"MUL";
break;
}
case 'D':
{
cout<<"DIV";
break;
}
case 'C':
cout<<"DUP";
}
}
}
else
cout<<"Impossible";
cout<<endl;
}
return 0;
}
Followed by:
Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator