Cod sursă (job #295603)

Utilizator avatar micutu Andrei Vasile Cont Fraudulent micutu IP ascuns
Problemă Immortal (clasele 9-10) Compilator cpp | 4,25 kb
Rundă Arhiva de probleme Status evaluat
Dată 26 mar. 2017 06:49:53 Scor 40
#include <cstdio>

using namespace std;

struct pair1
{
    int x,y;
}v[16],solutie[16];

int a[23][23],I;
bool rezolvare=1;

void bordare(int n,int m)
{
    for (int i=0;i<=n+1;++i)
    {
        if (i==0 || i==n+1)
            for (int j=0;j<=m+1;++j)
            a[i][j]=-1;

        else a[i][0]=-1, a[i][m+1]=-1;
    }
}

void afiseaza_solutie()
{
    for (int i=I;i>=2;--i)
    {
        printf("%d %d ",solutie[i].x/100,solutie[i].x%100);
        printf("%d %d\n",solutie[i].y/100,solutie[i].y%100);
    }
}

void bkt(int nemuritori)
{
    if (nemuritori==1) rezolvare=0, afiseaza_solutie();
    else
    {
        for (int i=1;i<=I && rezolvare;++i)
        {
            if (v[i].x!=-1)
            {
                if (a[v[i].x+1][v[i].y]==1 && a[v[i].x+2][v[i].y]==0)
                {
                    int j=1,modif_j=0;
                    for (;v[j].x!=v[i].x+1 || v[j].y!=v[i].y;++j);
                    modif_j=v[j].x;

                    a[v[i].x][v[i].y]=0;
                    a[v[i].x+1][v[i].y]=0;
                    a[v[i].x+2][v[i].y]=1;
                    solutie[nemuritori].x=v[i].x*100+v[i].y;
                    solutie[nemuritori].y=(v[i].x+2)*100+v[i].y;
                    v[j].x=-1;
                    v[i].x+=2;
                    bkt(nemuritori-1);
                    v[j].x=modif_j;
                    v[i].x-=2;
                    a[v[i].x][v[i].y]=1;
                    a[v[i].x+1][v[i].y]=1;
                    a[v[i].x+2][v[i].y]=0;
                }
                if (a[v[i].x-1][v[i].y]==1 && a[v[i].x-2][v[i].y]==0)
                {
                    int j=1,modif_j=0;
                    for (;v[j].x!=v[i].x-1 || v[j].y!=v[i].y;++j);
                    modif_j=v[j].x;

                    a[v[i].x][v[i].y]=0;
                    a[v[i].x-1][v[i].y]=0;
                    a[v[i].x-2][v[i].y]=1;
                    solutie[nemuritori].x=v[i].x*100+v[i].y;
                    solutie[nemuritori].y=(v[i].x-2)*100+v[i].y;
                    v[j].x=-1;
                    v[i].x-=2;
                    bkt(nemuritori-1);
                    v[j].x=modif_j;
                    v[i].x+=2;
                    a[v[i].x][v[i].y]=1;
                    a[v[i].x-1][v[i].y]=1;
                    a[v[i].x-2][v[i].y]=0;
                }
                if (a[v[i].x][v[i].y+1]==1 && a[v[i].x][v[i].y+2]==0)
                {
                    int j=1,modif_j=0;
                    for (;v[j].x!=v[i].x || v[j].y!=v[i].y+1;++j);
                    modif_j=v[j].x;

                    a[v[i].x][v[i].y]=0;
                    a[v[i].x][v[i].y+1]=0;
                    a[v[i].x][v[i].y+2]=1;
                    solutie[nemuritori].x=v[i].x*100+v[i].y;
                    solutie[nemuritori].y=v[i].x*100+v[i].y+2;
                    v[j].x=-1;
                    v[i].y+=2;
                    bkt(nemuritori-1);
                    v[j].x=modif_j;
                    v[i].y-=2;
                    a[v[i].x][v[i].y]=1;
                    a[v[i].x][v[i].y+1]=1;
                    a[v[i].x][v[i].y+2]=0;
                }
                if (a[v[i].x][v[i].y-1]==1 && a[v[i].x][v[i].y-2]==0)
                {
                    int j=1,modif_j=0;
                    for (;v[j].x!=v[i].x || v[j].y!=v[i].y-1;++j);
                    modif_j=v[j].x;

                    a[v[i].x][v[i].y]=0;
                    a[v[i].x][v[i].y-1]=0;
                    a[v[i].x][v[i].y-2]=1;
                    solutie[nemuritori].x=v[i].x*100+v[i].y;
                    solutie[nemuritori].y=v[i].x*100+v[i].y-2;
                    v[j].x=-1;
                    v[i].y-=2;
                    bkt(nemuritori-1);
                    v[j].x=modif_j;
                    v[i].y+=2;
                    a[v[i].x][v[i].y]=1;
                    a[v[i].x][v[i].y-1]=1;
                    a[v[i].x][v[i].y-2]=0;
                }
            }
        }
    }
}

int main()
{
    freopen("immortal.in","r",stdin);
    freopen("immortal.out","w",stdout);
    int n,m;
    scanf("%d %d %d\n",&n,&m,&I);
    for (int i=1;i<=I;++i)
    {
        scanf("%d %d\n",&v[i].x,&v[i].y);
        a[v[i].x][v[i].y]=1;
    }
    bordare(n,m);
    bkt(I);
}