Pagini recente »
Cod sursă (job #333349)
Cod sursă (job
#333349)
#include <cstdio>
#define NMax 54
#define LgMax NMax * NMax
using namespace std;
int T[NMax][NMax];
int n, m, nr;
struct Poz {int x, y;} P[LgMax];
struct Lupta {struct Poz v, m;} sol[LgMax];
int ok,mort[LgMax];
int dx[]={-1,0,1,0};
int dy[]={0,1,0,-1};
void citire()
{ int k=0;
freopen("immortal.in","r",stdin);
scanf("%d %d %d",&n,&m,&nr);
for(int x,y,i=1;i<=nr;i++) {scanf("%d %d",&x,&y); T[x+1][y+1]=i;}
for(int i=2;i<=n+1;i++)
for(int j=2;j<=m+1;j++)
if(T[i][j]) {P[++k].x=i; P[k].y=j; T[i][j]=k;}
for(int i=0;i<n+4;i++) T[i][0]=T[i][1]=T[i][m+3]=T[i][m+2]=-1;
for(int i=0;i<m+4;i++) T[0][i]=T[1][i]=T[n+2][i]=T[n+3][i]=-1;
}
void afisare()
{ freopen("immortal.out","w",stdout);
for(int i=0;i<nr-1;i++)
printf("%d %d %d %d\n",sol[i].v.x-1,sol[i].v.y-1,sol[i].m.x-1,sol[i].m.y-1);
}
void bkt(int k) //s-au desfasurat k lupte sol[0], ..., sol[k-1]
{ int i,d,x,y,moare;
if(!ok)
{ if(k==nr-1) {ok=1; afisare();}
else
for(i=1;i<=nr;i++)
if(!mort[i])
{ //poate sari i?
x=P[i].x; y=P[i].y;
for(d=0;d<4;d++)
if(T[x+dx[d]][y+dy[d]]>0 && T[x+2*dx[d]][y+2*dy[d]]==0)
{ //un vecin peste care poate sari
moare=T[x+dx[d]][y+dy[d]];
sol[k].m.x=x+2*dx[d]; sol[k].m.y=y+2*dy[d];
sol[k].v.x=x; sol[k].v.y=y;
P[i].x=x+2*dx[d]; P[i].y=y+2*dy[d];
T[x][y]=0; T[x+2*dx[d]][y+2*dy[d]]=i;
mort[T[x+dx[d]][y+dy[d]]]=1;
T[x+dx[d]][y+dy[d]]=0;
bkt(k+1);
P[i].x=x; P[i].y=y;
T[x][y]=i; T[x+2*dx[d]][y+2*dy[d]]=0;
T[x+dx[d]][y+dy[d]]=moare;
mort[T[x+dx[d]][y+dy[d]]]=0;
}
}
}
}
void afisare(void);
int main()
{ citire();
bkt(0);
return 0;
}