| ||||||||||
| 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 | |||||||||
我看google不到解题报告,所以把自己的代码贴出来了。希望暂时没做出来的,看了,会知道些~思路:没什么好讲的,就是DFS,但其实是iterative deepening,别笑我了,有时候,有点代码参考还是好些的,总比没有强。当你不知道错哪了,又没有别人的代码参考时,是很痛苦的~
/*
* Consider only programs that have at most 10 statements.
*/
//import java.io.*;
import java.util.*;
public class Main {
private enum Op{
ADD,
SUB,
MUL,
DIV,
DUP;
}
private int[][] stack;
private int top;
private Op[] opSequence;
private int len;
private int n;
private int[] x,y;
private Op[] opOptimal;
private int opLen;
private int maxDepth;
private boolean findOne;
private static final Main test=new Main(10);
private Main(int size){
stack=new int[size][11];//"at most 10 statements"(only DUP increases stack
//size by 1)
opSequence=new Op[10];
opOptimal=new Op[10];
x=new int[size];
y=new int[size];
}
private void init(int n,Scanner in){
this.n=n;
for(int i=0;i<n;i++)
x[i]=in.nextInt();
for(int i=0;i<n;i++)
y[i]=in.nextInt();
for(int i=0;i<n;i++)
stack[i][0]=x[i];//push
opLen=top=len=0;
findOne=false;
}
public static Main getInstance(int n,Scanner in){
test.init(n, in);
return test;
}
/*public static void main(String[] args) throws IOException{
Scanner in=new Scanner(new File("inputFiles/poj/OptimalPrograms.txt"));*/
public static void main(String[] args){
Scanner in=new Scanner(System.in);
Main test;
int n;
int counter=1;
while((n=in.nextInt())!=0){
test=Main.getInstance(n, in);
System.out.println("Program "+counter);
counter++;
test.runAndPrint();
System.out.println();
}
}
public void runAndPrint(){
int i;
for(i=0;i<n;i++)
if(x[i]!=y[i])
break;
if(i==n){
System.out.println("Empty sequence");
return ;
}
for(maxDepth=1;maxDepth<11;maxDepth++)
if(DFS(0)){
//System.out.println("len:"+len);
for(i=0;i<opLen;i++)
System.out.print(opOptimal[i]+" ");
System.out.println();
break;
}
/* maxDepth=4;
DFS(0);*/
if(maxDepth==11)
System.out.println("Impossible");
}
private boolean isSolution(int[][] stack,int top){
if(top>0)return false;
for(int i=0;i<n;i++)
if(stack[i][0]!=y[i])
return false;
return true;
}
/*
* s1 lexicographically precedes s2.
*/
private boolean better(Op[] s1,Op[] s2){
for(int i=0;i<len;i++)
if(!s1[i].toString().equals(s2[i].toString()))
return s1[i].toString().compareTo(s2[i].toString())<0;
return false;
}
private boolean isViable(Op t,int[][] stack,int top){
switch(t){
case ADD:
for(int i=0;i<n;i++)
if(Math.abs(stack[i][top-1]+stack[i][top])>30000)
return false;
return true;
case SUB:
for(int i=0;i<n;i++)
if(Math.abs(stack[i][top-1]-stack[i][top])>30000)
return false;
return true;
case MUL:
for(int i=0;i<n;i++)
if(Math.abs(stack[i][top-1]*stack[i][top])>30000)
return false;
return true;
case DIV://Notice that DIV never increase the abs value.
for(int i=0;i<n;i++)
if(stack[i][top]==0)
return false;
return true;
default: return true;
}
}
private boolean DFSAssist(int depth,int[] a,int[] b){
boolean flag=false;
if(DFS(depth+1))
flag=true;
//restore:
for(int i=0;i<n;i++){
stack[i][top]=b[i];
stack[i][top+1]=a[i];
}
top++;
len--;
return flag;
}
private boolean DFS(int depth){
boolean flag=false;
if(isSolution(stack,top)){
if(!findOne||better(opSequence,opOptimal)){
opLen=len;
for(int i=0;i<len;i++)
opOptimal[i]=opSequence[i];
}
findOne=true;
return true;
}
if(depth>=maxDepth)
return false;
/*check each operation*/
int[] a=new int[n];
for(int i=0;i<n;i++)
a[i]=stack[i][top];
//dup:
top++;
//debug(top,depth);
for(int i=0;i<n;i++)
stack[i][top]=a[i];
opSequence[len++]=Op.DUP;
if(DFS(depth+1))
flag=true;
//restore:
top--;
len--;
if(top>0){
int[] b;
b=new int[n];
for(int i=0;i<n;i++)
b[i]=stack[i][top-1];
//add:
if(isViable(Op.ADD,stack,top)){
top--;
for(int i=0;i<n;i++){
stack[i][top]=b[i]+a[i];
}
opSequence[len++]=Op.ADD;
if(DFSAssist(depth,a,b))
flag=true;
}
//sub:
if(isViable(Op.SUB,stack,top)){
top--;
for(int i=0;i<n;i++){
stack[i][top]=b[i]-a[i];
}
opSequence[len++]=Op.SUB;
if(DFSAssist(depth,a,b))
flag=true;
}
//MUL:
if(isViable(Op.MUL,stack,top)){
top--;
for(int i=0;i<n;i++){
stack[i][top]=b[i]*a[i];
}
opSequence[len++]=Op.MUL;
if(DFSAssist(depth,a,b))
flag=true;
}
//DIV:
if(isViable(Op.DIV,stack,top)){
top--;
for(int i=0;i<n;i++){
stack[i][top]=b[i]/a[i];
}
opSequence[len++]=Op.DIV;
if(DFSAssist(depth,a,b))
flag=true;
}
}
return flag;
}
}
Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator