Escribe un programa que dado un tablero de ajedrez con sus piezas, determine si alguno de los dos reyes esta en jaque.
Entrada
El tablero se representara como una matriz de 8x8 caracteres. Las letras mayusculas representan las piezas blancas, las letras minusculas representan las piezas negras. Las piezas blancas inician de la fila 1 y las piezas negras inician de la fila 8. Las piezas se representaran con las siguientes letras.
Peon - (p)
Torre - (t)
Caballo - (c)
Alfil - (a)
Reina - (e)
Rey - (r)
Espacio vacio - (.)
Lineas 1 a 8: Cada linea contiene 8 caracteres que representan las piezas o espacios vacios en esa fila.
NOTA: Los tableros que se te den como entrada no necesariamente seran tableros de un partido de ajedrez. En los tableros que se te den como entrada puede haber por ejemplo 3 caballos blancos o situaciones asi que no serian posibles en un juego real.
Salida
Linea 1: Debe contener un 1 si el rey blanco esta en jaque y un cero si no es asi.
Linea 2: Debe contener un 1 si el rey negro esta en jaque y un cero si no es asi.
Este es mi codigo:
Código
[/code]
#include<bits/stdc++.h> using namespace std; int main(){ cin.tie(0); ios_base::sync_with_stdio(0); bool reynegro=false,reyblanco=false; // lo que hago aqui es declarar un booleano en falso para si cualquier rey esta en jaque cambiarlo a true char ar[8][8]; // declaro el tablero int i,j,k,l; //como uso muchos for mejor declare las i,j,k,l for(i=0; i<8; i++){ // introducen las piezas for(j=0; j<8; j++) cin>>ar[i][j]; } /* este es la parte complicada, aqui lo que hago es un barrido de todo el tablero si me encuentro con una torre, caballo, alfil,peon, o dama hago lo siguiente (el rey y los puntos, es decir casillas vacias los ignoro) otra cosa importante que decir es que como la dama es la combinacion de torre y alfil puse en el if de cada uno "T" y "E" para reducir el codigo. ademas una vez que veo que un rey esta en jaque hago un break (para que seguir buscando algo que ya encontre ;-)) i=coordena x; j=coordenada y; si puedes notar pongo un if con las mayusculas (piezas blancas) y si no son pues obiamente son minusculas que es lo que pongo en el else (claro que el rey que se pone en jaque es el blanco y comparo en la R en vez de r) */ [code=cpp] for(i=0; i<8; i++){ for(j=0; j<8; j++){ if(ar[i][j]=='T' || ar[i][j]=='t' || ar[i][j]=='E' || ar[i][j]=='e'){ //tore y dama if(ar[i][j]=='T' || ar[i][j]=='E'){ //si es mayuscula es pieza blanca sino negra for(k=i-1; k>=0; k--)//arriba if(ar[k][j] == 'r')reynegro=true; else if(ar[k][j] != '.')break; for(k=i+1; k<8; k++)//abajo if(ar[k][j] == 'r')reynegro=true; else if(ar[k][j] != '.')break; for(k=j-1; k>=0; k--)//izquierda if(ar[i][k] == 'r')reynegro=true; else if(ar[i][k] != '.')break; for(k=j+1; k<8; k++)//derecha if(ar[i][k] == 'r')reynegro=true; else if(ar[i][k] != '.')break; } else{ for(k=i-1; k>=0; k--)//arriba if(ar[k][j] == 'R')reyblanco=true; else if(ar[k][j] != '.')break; for(k=i+1; k<8; k++)//abajo if(ar[k][j] == 'R')reyblanco=true; else if(ar[k][j] != '.')break; for(k=j-1; k>=0; k--)//izquierda if(ar[i][k] == 'R')reyblanco=true; else if(ar[i][k] != '.')break; for(k=j+1; k<8; k++)//derecha if(ar[i][k] == 'R')reyblanco=true; else if(ar[i][k] != '.')break; } } if(ar[i][j]=='C' || ar[i][j]=='c'){ //caballo if(ar[i][j]=='C'){ // si es mayuscula es pieza blanca sino negra if(ar[i+1][j-2]=='r' || ar[i-1][j-2]=='r' || ar[i+2][j-1]=='r' || ar[i+2][j+1]=='r' || ar[i-2][j-1]=='r' || ar[i-2][j+1]=='r' || ar[i+1][j+2]=='r' || ar[i-1][j+2]=='r') reynegro=true; } else{ if(ar[i+1][j-2]=='R' || ar[i-1][j-2]=='R' || ar[i+2][j-1]=='R' || ar[i+2][j+1]=='R' || ar[i-2][j-1]=='R' || ar[i-2][j+1]=='R' || ar[i+1][j+2]=='R' || ar[i-1][j+2]=='R') reyblanco=true; } } if(ar[i][j]=='A' || ar[i][j]=='a' || ar[i][j]=='E' || ar[i][j]=='e'){ //alfil y dama if(ar[i][j]=='A' || ar[i][j]=='E'){ //si es mayuscula es pieza blanca sino negra for(k=i-1,l=j-1; k>=0 && l>=0; k--,l--)//izquierda, arriba if(ar[k][l] == 'r')reynegro=true; else if(ar[k][l] != '.')break; for(k=i+1,l=j-1; k<8 && l>=0; k++,l--)//izquierda abajo if(ar[k][l] == 'r')reynegro=true; else if(ar[k][l] != '.')break; for(k=i-1,l=j+1; k>=0 && j<8; k--,l++)//derecha, arriba if(ar[k][l] == 'r')reynegro=true; else if(ar[k][l] != '.')break; for(k=i+1,l=j+1; k<8 && l<8; k++,l++)//derecha, abajo if(ar[k][l] == 'r')reynegro=true; else if(ar[k][l] != '.')break; } else{ for(k=i-1,l=j-1; k>=0 && l>=0; k--,l--)//izquierda, arriba if(ar[k][l] == 'R')reyblanco=true; else if(ar[k][l] != '.')break; for(k=i+1,l=j-1; k<8 && l>=0; k++,l--)//izquierda abajo if(ar[k][l] == 'R')reyblanco=true; else if(ar[k][l] != '.')break; for(k=i-1,l=j+1; k>=0 && j<8; k--,l++)//derecha, arriba if(ar[k][l] == 'R')reyblanco=true; else if(ar[k][l] != '.')break; for(k=i+1,l=j+1; k<8 && l<8; k++,l++)//derecha, abajo if(ar[k][l] == 'R')reyblanco=true; else if(ar[k][l] != '.')break; } } if(ar[i][j]=='P' || ar[i][j]=='p'){ //peon if(ar[i][j]=='P'){//si es mayuscula es pieza blanca sino negra if(ar[i+1][j-1]=='r' || ar[i+1][j+1]=='r')reynegro=true; } else{ if(ar[i-1][j-1]=='R' || ar[i-1][j+1]=='R')reyblanco=true; } } } } if(reyblanco)cout<<1; else cout<<0; // ya solo checo: si el reyblanco dio verdadero pongo que esta en jaque es decir un 1 cout<<"\n"; if(reynegro)cout<<1; else cout<<0;//hago lo mismo de arriba return 0; }
al enviar mi respuesta me da 90%
por mas que busco no encuentro mi error, podrian decirme cual es?
te lo agradeceria mucho.[/center][/left][/pre][/right][/center][/left][/font][/left][/left][/pre][/pre][/pre]