Cod sursă (job #333349)

Utilizator avatar iulianrotaru Rotaru Iulian iulianrotaru IP ascuns
Problemă Immortal (clasele 9-10) Compilator cpp | 2,06 kb
Rundă Arhiva de probleme Status evaluat
Dată 21 dec. 2017 11:29:56 Scor 70
#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;
}