Listing FIRE.CPP 



#include "fire.h" 
 
 int n; 
 
 void impar(void){ 
 int nr,x,t,k,j,sol,i; 
 int a[501],b[501],c[501],sel[501]; 
 for (i=1;i<=n/2;i++) Connect(i*2-1, i*2); 
 GoDown(); 
 for(i=1;i<=n;i++) a[i]=0; 
 for(i=1;i<=n;i++) b[i]=0; 
 for(i=1;i<=n;i++) c[i]=0; 
 sol=0; 
 for(i=1;i<=n;i++) 
 if(!a[i]){ 
 a[i]=i; 
 if(!sol) sol=i; 
 for(j=i+1;j<=n;j++) 
 if(IsConnect(i,j)){ 
 if(sol==i) sol=0; 
 a[j]=i; 
 } 
 } 
 for(i=1;i<=n;i++) sel[i]=0; 
 sel[sol]=1; x=sol; nr=0; 
 for(j=1;j<=n;j++) 
 if(!sel[j] && nr!=n/2){ 
 nr++; 
 Connect(x,j); 
 c[x]=c[j]=x; 
 sel[j]=1; 
 for(i=j+1;i<=n;i++) 
 if(a[j]==a[i])x=i,sel[i]=1; 
 } 
 GoUp(); 
 Clear(); 
 sol=0; 
 for(i=1;i<=n;i++) 
 if(!b[i]){ 
 b[i]=i; 
 if(!sol) sol=i; 
 for(j=i+1;j<=n;j++) 
 if(IsConnect(i,j)){ 
 if(sol==i) sol=0; 
 b[j]=i; 
 } 
 } 
 for(i=1;i<=n;i++) 
 if(!c[i]) x=i; 
 Solution(sol, x); 
 for(i=1;i<=n/2;i++){ 
 for(j=1;j<=n;j++) 
 if(a[x]==a[j] && x!=j) k=j; 
 if(sol%2) t=sol+1; 
 else t=sol-1; 
 Solution(t,k); 
 for(j=1;j<=n;j++) 
 if(c[k]==c[j] && k!=j) x=j; 
 for(j=1;j<=n;j++) 
 if(b[t]==b[j] && t!=j) sol=j; 
 Solution(sol,x); 
 } 
 Stop(); 
 } 
 
 void par(void){ 
 int nr,sol2,x,t,k,j,sol,i,liber, liber_jos,a[501],b[501],c[501],sel[501];  
 for(i=1;i<=(n-2)/2;i++) 
 Connect(i*2-1,i*2); 
 GoDown(); 
 for(i=1;i<=n;i++) 
 a[i]=b[i]=c[i]=0; 
 sol=sol2=0; 
 for(i=1;i<=n;i++) 
 if(!a[i]){ 
 a[i]=i; 
 if(!sol) sol=i; 
 for(j=i+1;j<=n;j++) 
 if(IsConnect(i,j)){ 
 if(sol==i) sol=0; 
 a[j]=i; 
 } 
 if(sol && !sol2) sol2=sol,sol=0; 
 } 
 for(i=1;i<=n;i++) sel[i]=0; 
 sel[sol]=sel[sol2]=1; 
 liber_jos=sol2; 
 x=sol; nr=0; 
 for(j=1;j<=n;j++) 
 if(!sel[j] && nr!=(n-2)/2){ 
 nr++; 
 Connect(x, j); 
 c[x]=c[j]=x; 
 sel[j]=1; 
 for(i=j+1;i<=n;i++) 
 if(a[j]==a[i]) x=i,sel[i]=1; 
 } 
 GoUp(); 
 Clear(); 
 sol=sol2=0; 
 for(i=1;i<=n;i++) 
 if(!b[i]){ 
 b[i]=i; 
 if(!sol) sol=i; 
 for(j=i+1;j<=n;j++) 
 if(IsConnect(i,j)){ 
 if(sol==i) sol=0; 
 b[j]=i; 
 } 
 if(sol && !sol2) sol2=sol,sol=0; 
 } 
 if(sol>n-2) liber=sol,sol=sol2; 
 else liber=sol2; 
 Solution(liber,liber_jos); 
 for(i=1;i<=n;i++) 
 if(!c[i] && i!=liber_jos) x=i; 
 Solution(sol,x); 
 for(i=1;i<=(n-2)/2;i++){ 
 for(j=1;j<=n;j++) 
 if(a[x]==a[j] && x!=j) k=j; 
 if(sol%2) t=sol+1; 
 else t=sol-1; 
 Solution(t,k); 
 for(j=1;j<=n;j++) 
 if(c[k]==c[j] && k!=j) x=j; 
 for(j=1;j<=n;j++) 
 if(b[t]==b[j] && t!=j) sol=j; 
 Solution(sol,x); 
 } 
 Stop(); 
 } 
 
 void main(void){ 
 GoUp(); 
 Start(); 
 n=Number(); 
 if(n%2) impar(); 
 else par(); 
 } 

[cuprins]