fbpx

Problema #2479 – pietre – Rezolvari PBInfo

de Mihai-Alexandru

O tablă de joc cu n linii, numerotate de la 1 la n și m coloane, numerotate de la 1 la m conține n*m celule identice. Celula din colţul din stânga sus se află pe linia 1 şi coloana 1. O celulă poate fi: celulă liberă, celulă în care se află o piatră sau celulă de tip gaură.

Pietrele sunt numerotate cu valori începând de la 1. Numerotarea pietrelor pe tablă se face în ordinea în care sunt

Exemplu

pietre.in

5 4 6 2
1 1
1 2
2 2
3 2
3 3
4 1
3 4
5 3
VSE

pietre.out

5
4
1 1
1 2
2 2
5 1

Explicație

Piatra 1: nu poate efectua săritura V (deoarece ar părăsi tabla de joc), nici săritura S (pentru că nu există nicio piatră în celula vecină aflată în direcția sud), efectuează săritura E, deci configurația finală a tabelei va conține 5 pietre.
Pentru piatra 2 se obține configurația finală identică celei inițiale, deoarece nu poate efectua nicio săritură.
Piatra 3 poate efectua doar săritura S. Configurația finală conține 5 pietre.
Piatra 4 nu poate efectua nicio săritură. Configurația finală conține 6 pietre.
Piatra 5 poate efectua săriturile: V și dispare piatra 4, S și dispare piatra și nu poate efectua săritura E. Configurația finală are 4 pietre.
Piatra 6 nu poate efectua nicio săritură. Configurația finală conține 6 pietre.

# include <fstream>
using namespace std;

ifstream f("pietre.in");
ofstream g("pietre.out");

int dl[5]={0,-1,0,1,0}, dc[5]={0,0,1,0,-1}, a[102][102], b[102][102],c[102][102],x[10002][2];
int nrp,m,n,i,j,xx,minn,ii,jj,l,cl,k,t,d,piatra,p,q,p1,q1;
char s[256];
int main()
{
 f>>m>>n>>k>>t;
 for (i=1;i<=k;i++)
 { f>>l>>cl;
   a[l][cl]=1;
   x[i][0]=l;
   x[i][1]=cl;
 }
 for (i=1;i<=t;i++)
 { f>>l>>cl;
   a[l][cl]=-1;
 }
 i=0;
 while (f>>s[i])
    i++;
 xx=i;
 for(i=0;i<=m+1;i++)
 {  a[i][0]=-1;
    a[i][n+1]=-1;
 }
 for(j=1;j<=n;j++)
 {
   a[0][j]=-1;
   a[m+1][j]=-1;
 }
 minn=m*n+1;

 for(p=1;p<=k;p++)
    {i=x[p][0];j=x[p][1];
      for (ii=0;ii<=m+1;ii++)
        for(jj=0;jj<=n+1;jj++)
          b[ii][jj]=a[ii][jj];
     for (t=0;t<xx;t++)
    {
        if(s[t]=='N') d=1;
         else
            if (s[t]=='S') d=3;
              else
                if (s[t]=='E') d=2;
                   else
                    d=4;
        if (b[i+dl[d]][j+dc[d]]==1)
            if (i+2*dl[d]>=1 && i+2*dl[d]<=m && j+2*dc[d]>=1 && j+2*dc[d]<=n)
            if (b[i+2*dl[d]][j+2*dc[d]]==0)
          {
           b[i+2*dl[d]][j+2*dc[d]]=1;
           b[i+dl[d]][j+dc[d]]=0;
           b[i][j]=0;
           i=i+2*dl[d];
           j=j+2*dc[d];
          }
    }
      nrp=0;
      for (ii=1;ii<=m;ii++)
       for (jj=1;jj<=n;jj++)
         if (b[ii][jj]==1)
            nrp=nrp+1;
       if (nrp<minn)
              {
               minn=nrp;
               for (p1=1;p1<=m;p1++)
                 for (q1=1;q1<=n;q1++)
                    c[p1][q1]=b[p1][q1];

               piatra=p;
              }
    }
   g<<piatra<<endl<<minn<<endl;
   for (i=1;i<=m;i++)
    for (j=1;j<=n;j++)
     if (c[i][j]==1)
       g<<i<<" "<<j<<endl;
    return 0;
}
Comentarii

S-ar putea sa iti placa