Rezolvare completă PbInfo #1221 PieseSah

Cerința

Se consideră o tablă de șah de dimensiune n (alcătuită din n linii si n coloane), pe care se află m piese de șah, fiecare putând fi: pion, rege, regină, nebun, tură sau cal). Se dau coordonatele a t căsuțe de pe tablă și se cere să se verifice pentru fiecare dacă este atacată, ocupată sau neatacată de piesele care se află pe tablă .

Date de intrare

Fișierul de intrare piesesah.in conține pe prima linie trei numere n m t. Următoarele m linii conțin un caracter, literă mică (reprezentând tipul piesei) urmat de două numere naturale reprezentând coordonatele piesei. Următoarele t linii conțin câte două numere naturale reprezentând coordonatele unei căsuțe care trebuie verificată.

Date de ieșire

Fișierul de ieșire piesesah.out va conține pe t linii câte un singur număr natural 0 , 1 sau 2, după cum căsuța corespunzătoare este neatacată, atacată sau ocupată.

Restricții și precizări

  • 1 ≤ n ≤ 1000
  • 1 ≤ m < n * n
  • 1 ≤ t ≤ 50000
  • Nu vor exista două piese pe aceeași poziție;
  • Caracterele care precizează piesele de pe tablă pot fi:
    • p – pion;
    • r – rege;
    • q – regină;
    • n – nebun;
    • t – tură;
    • c – cal;
  • Piesele de pe tablă atacă astfel:
    • regele atacă oricare dintre cele 8 căsuțe vecine pe linie, coloană sau diagonale, situate pe tablă;
    • pionul atacă oricare dintre cele 4 căsuțe vecine pe diagonale, situate pe tablă;
    • calul atacă oricare dintre 8 căsuțe, situate pe tablă, în care poate ajunge sărind în L;
    • regina atacă orice căsuță de pe tablă aflată pe aceeași linie, coloană sau diagonală cu ea, dar până la întâlnirea altei piese;
    • nebunul atacă orice căsuță de pe tablă aflată pe aceeași diagonală cu el, dar până la întâlnirea altei piese;
    • tura atacă orice căsuță de pe tablă aflată pe aceeași linie sau coloană cu ea, dar până la întâlnirea altei piese;

Exemplul 1

piesesah.in

10 6 10
p 1 1
r 8 9
q 3 2
n 6 7
t 2 9
c 9 3
1 1
5 5
2 3
5 2
9 6
8 9
10 10
9 2
2 2
7 2

piesesah.out

2
0
1
1
0
2
0
1
1
1

Explicație

Tabla de șah arată astfel:

2 1 0 1 0 0 0 0 1 0 
1 1 1 1 1 1 1 1 2 1 
1 2 1 1 1 1 1 1 1 1 
1 1 1 0 1 0 0 0 1 0 
0 1 0 1 0 1 0 1 1 0 
0 1 0 0 1 0 2 0 1 0 
0 1 0 1 0 1 0 1 1 1 
1 1 0 0 1 0 1 1 2 1 
0 1 2 1 0 0 0 1 1 1 
1 1 1 0 1 0 0 0 1 0

Exemplul 2

piesesah.in

7 4 5
q 5 5
p 3 3
c 5 2
r 7 7
4 4
5 1
1 1
7 3
3 3

piesesah.out

1
0
0
1
2

Explicație

Tabla de șah arată astfel:

0 0 0 0 1 0 0 
0 1 0 1 1 0 0 
1 0 2 0 1 0 1 
0 1 0 1 1 1 0 
0 2 1 1 2 1 1 
0 0 0 1 1 1 1 
1 0 1 0 1 1 2 

Cum e corect?

cout < "As la info"; cout << "As la info"; cout >> "As la info";

Felicitări! Poți mai mult?

Avem sute de probleme pentru tine, fiecare cu explicații ușor de înțeles.

Greșit, dar nu-i bai!

Antrenează-te cu sutele de probleme pe care ți le-am pregătit. Îți explicăm fiecare problemă în parte.

Rezolvare

Iată rezolvarea de 100 de puncte pentru problema PieseSah:

/* se parcurge cu fiecare piesa din cele initiale tabla in functie de tip
se marcheaza pozitiile si apoi se raspunde intrebarilor direct */
#include <iostream>
#include <fstream>

using namespace std ;

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

//directiile pentru fiecare tip

const int dical[]={-2,-2,-1,-1,1,1,2,2},
          djcal[]={-1,1,-2,2,-2,2,-1,1};

const int dipion[]={-1,-1,1,1},
          djpion[]={-1,1,-1,1};

//ca si pionul doar ca mult
const int dinebun[]={-1,-1,1,1},
          djnebun[]={-1,1,-1,1};

const int direge[]={-1,-1,-1,0,0,1,1,1},
          djrege[]={-1,0,1,-1,1,-1,0,1};

//ca si regele doar ca mult...
const int diregina[]={-1,-1,-1,0,0,1,1,1},
          djregina[]={-1,0,1,-1,1,-1,0,1};

const int ditura[]={-1,0,0,1},
          djtura[]={0,-1,1,0};

//matricea in care memoram
int a[1050][1050] ;
//matricea in care memoram tipul
char b[1050][1050] ;

int main ()
{
  int n , m , t ;
  f >> n >> m >> t ;

 for ( int contor = 1 ; contor <= m ; ++contor )
    {
     char c ;
     int x , y ;
     f >> c >> x >> y ;
     b[x][y] = c ;
     a[x][y] = 2 ;
    }
 for ( int x = 1 ; x <= n ; ++x )
    for ( int y = 1 ; y <= n ; ++y )
        if ( a[x][y] == 2 ) // e piesa , incepem parcurgerea
            {
             if ( b[x][y] == 'p' )
                {
                 for ( int k = 0 ; k < 4 ; ++k )
                    {
                     int i = x + dipion[k] ;
                     int j = y + djpion[k] ;
                     if ( a[i][j] == 0 && i > 0 && i <= n && j > 0 && j <= n )
                        a[i][j] = 1 ;
                    }
                }
             else if ( b[x][y] == 'r' )
                {
                 for ( int k = 0 ; k < 8 ; ++k )
                    {
                     int i = x + direge[k] ;
                     int j = y + djrege[k] ;
                     if ( a[i][j] == 0 && i > 0 && i <= n && j > 0 && j <= n )
                        a[i][j] = 1 ;
                    }
                }
             else if ( b[x][y] == 'c' )
                {
                 for ( int k = 0 ; k < 8 ; ++k )
                    {
                     int i = x + dical[k] ;
                     int j = y + djcal[k] ;
                     if ( a[i][j] == 0 && i > 0 && i <= n && j > 0 && j <= n )
                        a[i][j] = 1 ;
                    }
                }
             else if ( b[x][y] == 't' )
                {
                 for ( int k = 0 ; k < 4 ; ++k )
                        {
                         int i = x + ditura[k] ;
                         int j = y + djtura[k] ;
                         if ( ( a[i][j] == 0 || a[i][j] == 1 ) && i > 0 && i <= n && j > 0 && j <= n )
                                {
                                 a[i][j] = 1 ;
                                 while ( i > 0  && i <= n && j > 0 && j <= n )
                                   {
                                    if ( a[i][j] == 0 || a[i][j] == 1 )
                                        a[i][j] = 1 ;
                                    else if ( a[i][j] == 2 )
                                        break ;
                                    i = i + ditura[k] ;
                                    j = j + djtura[k] ;
                                   }
                                }
                        }
                }

             else if ( b[x][y] == 'n' )
                {
                 for ( int k = 0 ; k < 4 ; ++k )
                        {
                         int i = x + dinebun[k] ;
                         int j = y + djnebun[k] ;
                         if ( ( a[i][j] == 0 || a[i][j] == 1 ) && i > 0 && i <= n && j > 0 && j <= n )
                                {
                                 a[i][j] = 1 ;
                                 while ( i > 0  && i <= n && j > 0 && j <= n )
                                   {
                                    i = i + dinebun[k] ;
                                    j = j + djnebun[k] ;
                                    if ( a[i][j] == 0 || a[i][j] == 1 )
                                        a[i][j] = 1 ;
                                    else if ( a[i][j] == 2 )
                                        break ;
                                   }
                                }
                        }
            }
         else if ( b[x][y] == 'q' )
            {
             //e regina
             for ( int k = 0 ; k < 8 ; ++k )
                  {
                     int i = x + diregina[k] ;
                     int j = y + djregina[k] ;
                     if ( ( a[i][j] == 0 || a[i][j] == 1 ) && i > 0 && i <= n && j > 0 && j <= n )
                            {
                             a[i][j] = 1 ;
                             while ( i > 0  && i <= n && j > 0 && j <= n )
                               {
                                i = i + diregina[k] ;
                                j = j + djregina[k] ;
                                if ( a[i][j] == 0 || a[i][j] == 1 )
                                    a[i][j] = 1 ;
                                else if ( a[i][j] == 2 )
                                    break ;
                               }
                            }
                    }
            }
    }



 for ( int contor = 1 ; contor <= t ; ++contor )
    {
     int x , y ;
     f >> x >> y ;
     g << a[x][y] << "\n" ;
    }
 /*
 for ( int i = 1 ; i <= n ; ++i )
    {
     for ( int j = 1 ; j <= n ; ++j )
        g << a[i][j] << " " ;
     g << "\n" ;
    }
 */
}

Atenție

Enunțurile afișate pe această pagină aparțin exclusiv site-ului PbInfo. Astfel, pentru ștergerea conținutului, puteți să ne contactați la adresa Adresa de email.

Rezolvarea problemei #1221 PieseSah

Pe această pagină găsești rezolvarea de 100 de puncte pentru problema #1221 PieseSah de pe PbInfo.ro. Atenție: nu încurajăm copiatul codului! Totuși, credem cu tărie că analizarea unei soluții corecte este o metodă foarte ușoară de a învăța informatică, astfel că oferim sursele pentru peste 1500 de probleme de pe platforma PbInfo.ro.

Pentru rezolvări PbInfo de la peste 1500 de probleme, vă invităm să intrați pe site-ul nostru!