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 înL
; - 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;
- regele atacă oricare dintre cele
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 .
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!