Cod sursă (job #249995)

Utilizator avatar mateigabriel99 Matei Gabriel Valentin mateigabriel99 IP ascuns
Problemă Immortal (clasele 9-10) Compilator cpp | 2.11 kb
Rundă Arhiva de probleme Status evaluat
Dată 12 oct. 2016 09:24:02 Scor 30
#include <fstream>
#include <stdlib.h>

#define x first
#define y second

using namespace std;

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

struct sol
{
    int px,py,sx,sy;
}S[410];

const int dl[]={-1,0,1,0};
const int dc[]={0,1,0,-1};

int N,M,I;

pair <int,int> A[410];
bool f[410],V[22][22];

bool isOK(int i,int j)
{
    if (i<1 || i>N || j<1 || j>M)
        return 0;
    return 1;
}

int Cauta(int i,int j)
{
    for(int p=1;p<=I;p++)
    {
        if(!f[p] && A[p].x==i && A[p].y==j)
            return p;
    }
    return 0;
}

void Back(int k)
{
    if(k==1)
    {
        for(int i=I;i>=2;i--)
            fout<<S[i].px<<' '<<S[i].py<<' '<<S[i].sx<<' '<<S[i].sy<<'\n';
        exit(0);
    }
    else
        for(int i=1;i<=I;i++)
            if(!f[i])
            {
                int auxi=A[i].x;
                int auxj=A[i].y;

                for(int p=0;p<4;p++)
                {
                    int ii=auxi+dl[p];
                    int jj=auxj+dc[p];
                    int _ii=ii+dl[p];
                    int _jj=jj+dc[p];

                    if (isOK(_ii,_jj) && V[ii][jj] && !V[_ii][_jj])
                    {
                        int j=Cauta(ii, jj);

                        S[k].px=auxi;
                        S[k].py=auxj;
                        S[k].sx=_ii;
                        S[k].sy=_jj;

                        V[auxi][auxj]=0;
                        V[ii][jj]=0;
                        V[_ii][_jj]=1;
                        A[i].x=_ii;
                        A[i].y=_jj;
                        f[j]=1;

                        Back(k-1);

                        V[auxi][auxj]=1;
                        V[ii][jj]=1;
                        V[_ii][_jj]=0;
                        A[i].x=auxi;
                        A[i].y=auxj;
                        f[j]=0;
                    }
                }
            }
}

int main()
{
    fin>>N>>M>>I;
    for(int i=1;i<=I;i++)
    {
        fin>>A[i].x>>A[i].y;
        V[A[i].x][A[i].y]=1;
    }
    Back(I);

    return 0;
}