Cod sursă (job #295609)

Utilizator avatar micutu Andrei Vasile Cont Fraudulent micutu IP ascuns
Problemă Immortal (clasele 9-10) Compilator cpp | 2,32 kb
Rundă Arhiva de probleme Status evaluat
Dată 26 mar. 2017 06:52:40 Scor 30
#include <fstream>
#include <iostream>
#include <stdint.h>
#include <string.h>
#include <stdlib.h>
using namespace std;
fstream f1("immortal.in", ios::in);
fstream f2("immortal.out", ios::out);
int16_t n, m, I, a[23][23], ok=1;
struct deplasare
{
    int16_t x, y;
}d[]={{0,0},{0,1},{1,0},{0,-1},{-1,0}};
struct solutii
{
    int16_t x1, x2, y1, y2;
}sol[20];
///in sol memo luptele
void afis()
{
    ok=0;
    int16_t i;
    for(i=1; i<I; i++)
        f2<<sol[i].x1<<" "<<sol[i].y1<<" "<<sol[i].x2<<" "<<sol[i].y2<<"\n";
}
void fct(int16_t i, int16_t j, int16_t val1, int16_t val2, int16_t &fin1, int16_t &fin2)
{
    if((i==0)&&(j==1))
    {
        fin1=val1;
        fin2=val2+2;
    }
    if((i==0)&&(j==-1))
    {
        fin1=val1;
        fin2=val2-2;
    }
    if((i==1)&&(j==0))
    {
        fin1=val1+2;
        fin2=val2;
    }
    if((i==-1)&&(j==0))
    {
        fin1=val1-2;
        fin2=val2;
    }
}
void bkt(int16_t i, int16_t j, int16_t pas)
{
    if(ok)
    {
   if(pas==I) afis();
   else
   {
    int16_t k, o, p;
    for(k=1; (k<=4)&&ok; k++)
        if(a[i+d[k].x][j+d[k].y]==1)///alegi pe care nemuritor din vecinatatea sa sa il bata
    {
       fct(d[k].x, d[k].y, i, j, sol[pas].x2, sol[pas].y2);///fct gaseste poz unde ajunge nemuritorul
       if( a[sol[pas].x2][ sol[pas].y2]==0)///daca pozitia pe care vrei sa o ocupe nem e libara
       {
           a[i][j]=0;
           a[i+d[k].x][j+d[k].y]=0;
           sol[pas].x1=i;
           sol[pas].y1=j;
           a[sol[pas].x2][ sol[pas].y2]=1;

           for(o=1; (o<=n)&&ok; o++)
             for(p=1; (p<=m)&&ok; p++)
                 if(a[o][p]==1) bkt(o, p, pas+1);

          a[sol[pas].x2][ sol[pas].y2]=0;
          a[i+d[k].x][j+d[k].y]=1;
          a[i][j]=1;
       }

    }
   }
    }
}
void bordare()
{
    int16_t i, j;
    for(i=0; i<=n+1; i++)
    {
        a[i][0]=-1;
        a[i][m+1]=-1;
    }
    for(j=0; j<=m+1; j++)
    {
        a[0][j]=-1;
        a[n+1][j]=-1;
    }
}
int main()
{
    int16_t i, j, x, y;
    f1>>n>>m>>I;
    for(i=1; i<=I; i++)
    {
       f1>>x>>y;
       a[x][y]=1;
    }
    bordare();
    for(i=1; i<=n; i++)
        for(j=1; j<=m; j++)
            if(a[i][j]) bkt(i, j, 1);///nemuritoul de pe i,j sare la bataie

    return 0;
}