zju1008

搜索题,25个格子就要递归25!次,不过在递归时及时判断可以减少很多的递归次数,最开始写了个程序,竟然超时了,于是想各种各样的见剪枝方法,发现都很难实现。最后用了个开始自认为效果不太好的方法---将25个格子分类,相同的方在一起,这样在放try一个格子时就知用搜索那几个类别的格子了,没想到过了,用了8.83s,不过看到有些强人只用了0.00.33s,太不可思议了,不知道用的是怎样的剪枝大法。

//zju 1008
//by woodfish

#include 
<iostream>
using namespace std;

typedef 
struct Square {
 
int top;
 
int bottom;
 
int left;
 
int right;
 
int num;
}
;

const int MAXN=5;
int n=0;
Square TTriangle;
Square Triangle[MAXN
*MAXN];
Square DifTriangle[MAXN
*MAXN];
int DifNum=0;
int game=0;

inline 
void GetXY(int pos,int& x,int& y){
 x
=pos/n;
 y
=pos%n;
}


bool Putcan(int pos,int i){
 
int x,y;
 GetXY(pos,x,y);
 
if(x-1>=0
  
if(Triangle[pos-n].bottom!=DifTriangle[i].top) return false;
 
if(y-1>=0)
  
if(Triangle[pos-1].right!=DifTriangle[i].left) return false;
 
return true;
}


inline 
void Move(int t,int i){
 Triangle[t].bottom
=DifTriangle[i].bottom;
 Triangle[t].top
=DifTriangle[i].top;
 Triangle[t].left
=DifTriangle[i].left;
 Triangle[t].right
=DifTriangle[i].right;
}


bool Try(int pos){
 
if(pos==n*n) return true;
 
else {
  
for(int i=0;i<DifNum;i++
   
if(DifTriangle[i].num>0&&Putcan(pos,i)) {
    Move(pos,i);
    DifTriangle[i].num
--;
    
if(Try(pos+1)==truereturn true;
    DifTriangle[i].num
++;
   }

   
return false;
 }

}


inline 
void Read(int n) {
 
int j;
 DifNum
=0;
 
for(int i=0;i<n*n;i++{
  cin
>>TTriangle.top>>TTriangle.right>>TTriangle.bottom>>TTriangle.left;
  
for(j=0;j<DifNum;j++
   
if( (TTriangle.bottom==DifTriangle[j].bottom)
    
&&(TTriangle.left==DifTriangle[j].left)
    
&&(TTriangle.right==DifTriangle[j].right)
    
&&(TTriangle.top==DifTriangle[j].top) )
    
break;
  
if(j==DifNum) {
   DifTriangle[j].bottom
=TTriangle.bottom;
   DifTriangle[j].top
=TTriangle.top;
   DifTriangle[j].left
=TTriangle.left;
   DifTriangle[j].right
=TTriangle.right;
   DifTriangle[j].num
=1;
   DifNum
++;
  }
else
   DifTriangle[j].num
++;
 }

}


int main() {
 
while(cin>>n) {
  game
++;
  
if(n==0break;
  Read(n);
  
if(game>1) cout<<endl;
  cout
<<"Game "<<game<<"";
  
if(Try(0)) 
   cout
<<"Possible"<<endl;
  
else
   cout
<<"Impossible"<<endl;
 }

 
return 1;
}


posted on 2006-11-10 18:40  woodfish  阅读(473)  评论(1编辑  收藏  举报

导航