Cod sursă (job #295602)

Utilizator avatar micutu Andrei Vasile Cont Fraudulent micutu IP ascuns
Problemă Immortal (clasele 9-10) Compilator cpp | 2,57 kb
Rundă Arhiva de probleme Status evaluat
Dată 26 mar. 2017 06:49:27 Scor 30
#include <fstream>
#define VMAX 23
#define ND 4
#define IMAX (VMAX*VMAX)-1
using namespace std;
ifstream cin("immortal.in");
ofstream cout("immortal.out");

struct pozitie
{
    int x, y;
};

pozitie locatii[IMAX], sol[IMAX];
int table[VMAX][VMAX], n, m, nr, dl[]={-1, 0, 1, 0}, dc[]={0, 1, 0, -1};
bool mort[IMAX], stopRulare;

void citire();
void bordare();
void rulare(int k);
void afisare();

int main()
{
    citire();
    bordare();
    rulare(1);
    afisare();
    return 0;
}

void citire()
{
    int i;
    cin >> n>> m>> nr;
    for (i=1; i<=nr; i++)
    {
        cin >> locatii[i].x>> locatii[i].y;
        table[locatii[i].x][locatii[i].y]=i;
    }
}

void afisare()
{
    int i;
    for (i=1; i<=2*nr-2; i+=2)
    {
        cout << sol[i].x<< ' '<< sol[i].y<< ' '<< sol[i+1].x<< ' '<< sol[i+1].y<< '\n';
    }
}

void bordare()
{
    int i;
    for (i=0; i<=m+1; i++)
    {
        table[0][i]=-1;
        table[n+1][i]=-1;
    }
    for (i=1; i<=n; i++)
    {
        table[i][0]=-1;
        table[i][m+1]=-1;
    }
}

void rulare(int k)
{
    int i, j, ant;
    pozitie crt, test, test2;
    if (stopRulare) return;
    if (k==nr)
    {
        stopRulare=1;
    }
    else
    {
        for (i=1; i<=nr; i++)
        {
            if (!mort[i])
            {
                crt=locatii[i];
                for (j=0; j<ND; j++)
                {
                    test.x=crt.x+dl[j];
                    test.y=crt.y+dc[j];
                    if (table[test.x][test.y]>0)
                    {
                        test2.x=test.x+dl[j];
                        test2.y=test.y+dc[j];
                        if (table[test2.x][test2.y]==0)
                        {
                            sol[k*2]=test2;
                            sol[k*2-1]=crt;
                            ant=table[test.x][test.y];
                            mort[ant]=1;
                            table[test.x][test.y]=0;
                            table[crt.x][crt.y]=0;
                            table[test2.x][test2.y]=i;
                            locatii[i]=test2;
                            rulare(k+1);
                            if (stopRulare) return;
                            table[test.x][test.y]=ant;
                            table[test2.x][test2.y]=0;
                            table[crt.x][crt.y]=i;
                            mort[ant]=0;
                            locatii[i]=crt;
                        }
                    }
                }
            }
        }
    }
}