Cod sursă (job #295617)

Utilizator avatar micutu Andrei Vasile Cont Fraudulent micutu IP ascuns
Problemă Immortal (clasele 9-10) Compilator cpp | 2,11 kb
Rundă Arhiva de probleme Status evaluat
Dată 26 mar. 2017 06:58:41 Scor 50
#include <fstream>
#include <iomanip>
#include <cstdlib>
using namespace std;
ifstream cin("immortal.in");
ofstream cout("immortal.out");
const int MAX = 25, GOL = 0, POM = -1;
int dx[]={0, 1, 0, -1};
int dy[]={1, 0, -1, 0};
struct immortal{
    int x, y, mort;
}v[MAX];
struct cell{
    int xs, ys, xf, yf;
}sol[MAX];
int a[MAX][MAX], lin, col, n;
void afis(){
    for(int i=0; i<=lin+3; i++){
        for(int j=0; j<=col+3; j++)
            cout<<setw(4)<<a[i][j]<<' ';
        cout<<endl;
    }
    cout<<endl;

}
void back(int k){
    if(k==n){
        for(int i=1; i<n; i++)
            cout<<sol[i].xs-1<<' '<<sol[i].ys-1<<' '<<sol[i].xf-1<<' '<<sol[i].yf-1<<'\n';
        exit(0);
    }
    for(int i=1; i<=n; i++)
        if(!v[i].mort)
            for(int d=0; d<4; d++)
            {
                int x = v[i].x, y = v[i].y, liber = 0, mort = 0;
                if(a[ x+2*dx[d] ][ y+2*dy[d] ]==GOL) liber = 1;
                int id =  a[ x+dx[d] ][ y+dy[d] ];
                if(id>0 and !v[id].mort) mort = id;
                if(liber and mort){
                    sol[k].xs = x; sol[k].ys = y;
                    sol[k].xf = x+2*dx[d]; sol[k].yf = y+2*dy[d];

                    a[ x+2*dx[d] ][ y+2*dy[d] ] = a[x][y];
                    a[x][y] = 0;
                    a[ x+dx[d] ][ y+dy[d] ] = 0;
                    v[mort].mort = 1;
                    v[i].x = x+2*dx[d]; v[i].y = y+2*dy[d];
                    back(k+1);
                    v[i].x = x; v[i].y = y;
                    v[mort].mort = 0;
                    a[ x+dx[d] ][ y+dy[d] ] = mort;
                    a[x][y] = a[ x+2*dx[d] ][ y+2*dy[d] ];
                    a[ x+2*dx[d] ][ y+2*dy[d] ] = 0;
                }
            }
}
int main()
{
    cin>>lin>>col>>n;
    for(int i=1; i<=n; i++){
        cin>>v[i].x>>v[i].y;
        v[i].x++; v[i].y++;
        a[ v[i].x ][ v[i].y ] = i;
    }
    for(int i=0; i<=lin+3; i++) a[i][0] = a[i][1] = a[i][col+2] = a[i][col+3] = POM;
    for(int i=0; i<=col+3; i++) a[0][i] = a[1][i] = a[lin+2][i] = a[lin+3][i] = POM;
    back(1);
    return 0;
}