Cod sursă (job #669309)

Utilizator avatar velciu_ilinca velciu ilinca velciu_ilinca IP ascuns
Problemă Immortal (clasele 9-10) Compilator cpp-32 | 2,80 kb
Rundă Tema BKT Status evaluat
Dată 14 oct. 2022 18:18:34 Scor 0
#include <fstream>

using namespace std;
ifstream in ("immortal.in");
ofstream out ("immortal.out");
int initial[25][25];
int n,m,k;
int mort[25];
int dx[]={1,0,-1,0};
int dy[]={0,1,0,-1};
struct lincol
{
    int l,c,dir;
};
lincol v[25],ans[25];
bool ok(int lin,int col)
{
    if (1<=lin && lin<=n && 1<=col && col<=m)
        return 1;
    else
        return 0;
}
void afisare()
{
    for (int i=1; i<=k-1; i++)
        out<<ans[i].l<<" "<<ans[i].c<<" "<<ans[i].l+2*dx[ans[i].dir]<<" "<<ans[i].c+2*dy[ans[i].dir]<<"\n";
}
void bkt(int nemuritor)///lupta ac nemuritor
{
    if (nemuritor==k)///daca am terminat toate luptele
        afisare();
    else
    {
        for (int j=1; j<=k; j++)
            if (mort[j]==0)///daca exista un nemuritor
            {
                int lin,col;
                lin=v[j].l;
                col=v[j].c;///poz nemuritor
                for (int d=0;d<=3;d++)///gasesc un inamic
                {
                    int lin_enemy,col_enemy;
                    lin_enemy=lin+dx[d];
                    col_enemy=col+dy[d];
                    int llin,ccol;
                    llin=lin+2*dx[d];///poz unde ajunge dupa ce sare
                    ccol=col+2*dy[d];
                    if (ok(llin,ccol)==1 && initial[lin_enemy][col_enemy]>0 && initial[llin][ccol]==0)
                    {///daca exista un inamic si poz de dupa saritura e libera
                        int x,y;
                        x=initial[lin][col];
                        y=initial[lin_enemy][col_enemy];
                        v[j].l=llin;
                        v[j].c=ccol;///nemuritorul ia poz de dupa saritura
                        mort[y]=1;///enemy is dead
                        initial[lin][col]=0;///sterg poz initiala a nemuritorului
                        initial[lin_enemy][col_enemy]=0;///sterg poz inamicului
                        initial[llin][ccol]=j;///noua poz a nemuritorului
                        ans[nemuritor].l=lin;
                        ans[nemuritor].c=col;///modific de fiecare data ca un nemuritor isi schimba poz
                        ans[nemuritor].dir=d;
                        bkt(nemuritor+1);///continuam deplasarea=>o alta saritura
                        mort[y]=0;///redeclare how it was before
                        initial[lin][col]=x;
                        initial[lin_enemy][col_enemy]=y;
                        initial[llin][ccol]=0;
                        v[j].l=lin;
                        v[j].c=col;
                    }
                }
            }
    }
}
int main()
{
    in>>n>>m>>k;
    for (int i=1;i<=k;i++)
    {
        in>>v[i].l>>v[i].c;
        initial[v[i].l][v[i].c]=i;//aici se afla un nemuritor
    }
    bkt(1);//incepem cu prima lupta=>trb sa moara cnv
    return 0;
}