Cod sursă (job #293090)

Utilizator avatar micutu Andrei Vasile Cont Fraudulent micutu IP ascuns
Problemă Immortal (clasele 9-10) Compilator cpp | 2,17 kb
Rundă Arhiva de probleme Status evaluat
Dată 13 mar. 2017 10:52:16 Scor 30
#include <fstream>
#include <cstdlib>
using namespace std;

ifstream fin("immortal.in");
ofstream fout("immortal.out");

struct pozitie
{
    int x;
    int y;
}P[101];

struct solutie
{
    int xi,yi,xf,yf;
}sol[101];

int n,m,nr,num,mort[101],x,y,a[101][101],i,j;

int dx[]={-1,0,1,0};
int dy[]={0,1,0,-1};

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

void afisare()
{
    int i,j;
    for (i=1;i<=nr-1;i++)
        fout<<sol[i].xi-1<<' '<<sol[i].yi-1<<' '
            <<sol[i].xf-1<<' '<<sol[i].yf-1
            <<'\n';
    exit(0);
}

void back(int k)
{
    int i=0,d,omorat,x,y;
    if (k==nr)
        afisare();
    else
        for (i=1;i<=nr;i++)
            if ( !mort[i] )
            {
                for ( d = 0 ; d < 4 ; d++ )
                {
                    x = P[i].x;
                    y = P[i].y;
                    if (a[x+dx[d]][y+dy[d]]>0&&a[x+2*dx[d]][y+2*dy[d]]==0)
                    {
                        omorat=a[x+dx[d]][y+dy[d]];
                        mort[omorat]=1;
                        P[i].x=x+2*dx[d];
                        P[i].y=y+2*dy[d];
                        sol[k].xi=x;
                        sol[k].yi=y;
                        sol[k].xf=x+2*dx[d];
                        sol[k].yf=y+2*dy[d];
                        a[x+dx[d]][y+dy[d]]=0;
                        a[x+2*dx[d]][y+2*dy[d]]=a[x][y];
                        a[x][y]=0;

                        back(k+1);
                        a[x][y]=a[x+2*dx[d]][y+2*dy[d]];
                        a[x+2*dx[d]][y+2*dy[d]]=0;
                        a[x+dx[d]][y+dy[d]]=omorat;
                        P[i].x=x;
                        P[i].y=y;
                        mort[omorat]=0;
                    }
                }
            }
}

int main()
{
    fin>>n>>m>>nr;
    for ( i = 1 ; i <= nr ; i++ )
    {
        fin >> x >> y;
        a[x+1][y+1]=i;
        P[i].x=x+1;
        P[i].y=y+1;
    }
    bordare();
    back(1);
    //afisare1();
    return 0;
}