| ||||||||||
| 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 | |||||||||
有人帮我看下代码么? -_______-bIn Reply To:为什么 Runtime Error 啊…… Posted by:150014 at 2008-11-19 18:57:22 import java.util.*;
public class Main{
private static final Scanner in=new Scanner(System.in);
private int size;
private Set<Integer> typeSizes=new TreeSet<Integer>();
private boolean[][] covered;
public Main(){
size=in.nextInt();
int typeNum=in.nextInt();
while(typeNum-->0){
int typeSize=in.nextInt();
if(typeSize<=size)
typeSizes.add(typeSize);
}
Set<Integer> toRemove=new HashSet<Integer>();
for(int typeSize:typeSizes)
for(int next:typeSizes)
if(next!=typeSize && next%typeSize==0)
toRemove.add(next);
typeSizes.removeAll(toRemove);
}
public boolean CanDivide(){
for(int typeSize:typeSizes)
if(size%typeSize==0)
return true;
covered=new boolean[2*size][4*size];
for(int x=0;x<size;x++)
Arrays.fill(covered[x],2*(size+x)+1,4*size,true);
for(int x=size;x<2*size;x++)
Arrays.fill(covered[x],0,2*(x-size)+1,true);
return Search(0,0);
}
private boolean Search(int x,int y){
if(x>=2*size)
return true;
if(y>=4*size)
return Search(x+1,0);
if(covered[x][y])
return Search(x,y+1);
int sizeMax=SizeMax(x,y);
for(int typeSize:typeSizes){
if(typeSize>sizeMax)
break;
Fill(x,y,typeSize,true);
if(Search(x,y+1))
return true;
Fill(x,y,typeSize,false);
}
return false;
}
private int SizeMax(int x,int y){
for(int typeSize=1;typeSize<size;typeSize++)
if(!SizeAvaliable(x,y,typeSize))
return typeSize-1;
return size;
}
private boolean SizeAvaliable(int x,int y,int testSize){
if(y%2==0){
for(int step=0;step<testSize;step++)
for(int yFill=y;yFill<=y+2*step;yFill++)
if(x+step>=2*size || yFill>=4*size || covered[x+step][yFill])
return false;
}
else{
for(int step=0;step<testSize;step++)
for(int yFill=y+2*step;yFill<=y+2*(testSize-1);yFill++)
if(x+step>=2*size || yFill>=4*size ||covered[x+step][yFill])
return false;
}
return true;
}
private void Fill(int x,int y,int size,boolean value){
if(y%2==0){
for(int step=0;step<size;step++)
for(int yFill=y;yFill<=y+2*step;yFill++)
covered[x+step][yFill]=value;
}
else{
for(int step=0;step<size;step++)
for(int yFill=y+2*step;yFill<=y+2*(size-1);yFill++)
covered[x+step][yFill]=value;
}
}
public static void main(String[] args){
int caseNum=in.nextInt();
while(caseNum-->0){
Main testCase=new Main();
System.out.println(testCase.CanDivide()?"YES":"NO");
}
}
}
Followed by:
Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator