Cod sursă (job #332046)

Utilizator avatar Rarres T E S L A P E F E L I E Rarres IP ascuns
Problemă Immortal (clasele 9-10) Compilator cpp | 2,17 kb
Rundă Arhiva de probleme Status evaluat
Dată 17 dec. 2017 17:10:02 Scor 0
#include <fstream>
#include <cstdlib>
using namespace std;
ifstream in("immortal.in");
ofstream out("immortal.out");
struct ura
{
    int x,y;
    bool stare;
};
struct ura2
{
    int xs,ys,xf,yf;
};
bool in_matrice(int x,int y);
void backtrack(int poz);
void print();
ura om[20];
ura2 sol[20];
int n,m,p,v[21][21],nrs,k,id,i,j;
int dx[]= {0,-1,0,1};
int dy[]= {-1,0,1,0};
int main()
{
    in>>n>>m>>p;
    for(i=1; i<=p; i++)
    {
        in>>om[i].x>>om[i].y;
        v[om[i].x][om[i].y]=i;
    }
    ///print();
    backtrack(1);
    return 0;
}
bool in_matrice(int x,int y)
{
    return (x>=1 && x<=n && y>=1 && y<=m);
}
void backtrack(int poz)
{
    if(poz==p)
    {
        for(i=1; i<p; i++)
            out<<sol[i].xs<<" "<<sol[i].ys<<" "<<sol[i].xf<<" "<<sol[i].yf<<'\n';
        exit(0);
    }
    for(int i=1; i<=p; i++)
    {
        if(om[i].stare==0)
        {
            for(int k=0; k<=3; k++)
                if(v[om[i].x+dx[k]][om[i].y+dy[k]]>0 && in_matrice(om[i].x+2*dx[k],om[i].y+2*dy[k]))
                {
                    nrs++;
                    sol[nrs].xs=om[i].x;
                    sol[nrs].ys=om[i].y;
                    id=v[om[i].x+dx[k]][om[i].y+dy[k]];
                    v[om[i].x][om[i].y]=0;
                    v[om[i].x+2*dx[k]][om[i].y+2*dy[k]]=i;
                    om[i].x+=2*dx[k];
                    om[i].y+=2*dy[k];
                    sol[nrs].xf=om[i].x;
                    sol[nrs].yf=om[i].y;
                    om[v[om[i].x-dx[k]][om[i].y-dy[k]]].stare=1;
                    v[om[i].x-dx[k]][om[i].y-dy[k]]=0;
                    ///print();
                    backtrack(poz+1);
                    nrs--;
                    v[om[i].x-2*dx[k]][om[i].y-2*dy[k]]=i;
                    v[om[i].x][om[i].y]=0;
                    om[i].x-=2*dx[k];
                    om[i].y-=2*dy[k];
                    om[id].stare=0;
                    v[om[i].x+dx[k]][om[i].y+dy[k]]=id;
                }
        }
    }
}
void print()
{
    for(int x=1;x<=n;x++)
    {
        for(int y=1;y<=m;y++)
            out<<v[x][y]<<' ';
        out<<'\n';
    }
    out<<'\n';
}