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] |