elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Introducción a Git (Primera Parte)


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Necesito tu ayuda, debo detectar un jaque en c++
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Necesito tu ayuda, debo detectar un jaque en c++  (Leído 2,823 veces)
KINGARZA

Desconectado Desconectado

Mensajes: 33

Facebook: Luis Garza


Ver Perfil
Necesito tu ayuda, debo detectar un jaque en c++
« en: 17 Junio 2016, 05:49 am »

El problema es el siguiente:

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
  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. int main(){
  4.    cin.tie(0);
  5.    ios_base::sync_with_stdio(0);
  6.    bool reynegro=false,reyblanco=false; // lo que hago aqui es declarar un booleano en falso
  7. para si cualquier rey esta en jaque cambiarlo a true
  8.    char ar[8][8]; // declaro el tablero
  9.    int i,j,k,l; //como uso muchos for mejor declare las i,j,k,l
  10.    for(i=0; i<8; i++){  // introducen las piezas
  11.        for(j=0; j<8; j++)
  12.            cin>>ar[i][j];
  13.    }
  14. /* este es la parte complicada, aqui lo que hago es un barrido de todo el tablero
  15. si me encuentro con una torre, caballo, alfil,peon, o dama hago lo siguiente
  16. (el rey y los puntos, es decir casillas vacias los ignoro)
  17. otra cosa importante que decir es que como la dama es la
  18.  combinacion de torre y alfil puse en el if de cada uno "T" y "E" para reducir el codigo.
  19. ademas una vez que veo que un rey esta en jaque hago un break
  20. (para que seguir buscando algo que ya encontre ;-))
  21. i=coordena x;
  22. j=coordenada y;
  23. si puedes notar pongo un if con las mayusculas (piezas blancas)
  24. y si no son pues obiamente son minusculas que es lo que pongo en el else
  25. (claro que el rey que se pone en jaque es el blanco y comparo en la R en vez de r) */
  26. [code=cpp]    for(i=0; i<8; i++){  
  27.        for(j=0; j<8; j++){
  28.            if(ar[i][j]=='T' || ar[i][j]=='t' || ar[i][j]=='E' || ar[i][j]=='e'){ //tore y dama
  29.                if(ar[i][j]=='T' || ar[i][j]=='E'){  //si es mayuscula es pieza blanca sino negra
  30.                   for(k=i-1; k>=0; k--)//arriba
  31.                        if(ar[k][j] == 'r')reynegro=true;
  32.                        else if(ar[k][j] != '.')break;
  33.                    for(k=i+1; k<8; k++)//abajo
  34.                        if(ar[k][j] == 'r')reynegro=true;
  35.                        else if(ar[k][j] != '.')break;
  36.                    for(k=j-1; k>=0; k--)//izquierda
  37.                        if(ar[i][k] == 'r')reynegro=true;
  38.                        else if(ar[i][k] != '.')break;
  39.                    for(k=j+1; k<8; k++)//derecha
  40.                        if(ar[i][k] == 'r')reynegro=true;
  41.                        else if(ar[i][k] != '.')break;
  42.                }
  43.                else{
  44.                    for(k=i-1; k>=0; k--)//arriba
  45.                        if(ar[k][j] == 'R')reyblanco=true;
  46.                        else if(ar[k][j] != '.')break;
  47.                    for(k=i+1; k<8; k++)//abajo
  48.                        if(ar[k][j] == 'R')reyblanco=true;
  49.                        else if(ar[k][j] != '.')break;
  50.                    for(k=j-1; k>=0; k--)//izquierda
  51.                        if(ar[i][k] == 'R')reyblanco=true;
  52.                        else if(ar[i][k] != '.')break;
  53.                    for(k=j+1; k<8; k++)//derecha
  54.                        if(ar[i][k] == 'R')reyblanco=true;
  55.                        else if(ar[i][k] != '.')break;
  56.                }
  57.            }
  58.            if(ar[i][j]=='C' || ar[i][j]=='c'){ //caballo
  59.                if(ar[i][j]=='C'){ // si es mayuscula es pieza blanca sino negra
  60.                    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'
  61.                    || ar[i-2][j-1]=='r' || ar[i-2][j+1]=='r' || ar[i+1][j+2]=='r' || ar[i-1][j+2]=='r')
  62.                    reynegro=true;
  63.                }
  64.                else{
  65.                    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'
  66.                    || ar[i-2][j-1]=='R' || ar[i-2][j+1]=='R' || ar[i+1][j+2]=='R' || ar[i-1][j+2]=='R')
  67.                    reyblanco=true;
  68.                }
  69.            }
  70.            if(ar[i][j]=='A' || ar[i][j]=='a' || ar[i][j]=='E' || ar[i][j]=='e'){ //alfil y dama
  71.                if(ar[i][j]=='A' || ar[i][j]=='E'){ //si es mayuscula es pieza blanca sino negra
  72.                    for(k=i-1,l=j-1; k>=0 && l>=0; k--,l--)//izquierda, arriba
  73.                        if(ar[k][l] == 'r')reynegro=true;
  74.                        else if(ar[k][l] != '.')break;
  75.                    for(k=i+1,l=j-1; k<8 && l>=0; k++,l--)//izquierda abajo
  76.                        if(ar[k][l] == 'r')reynegro=true;
  77.                        else if(ar[k][l] != '.')break;
  78.                    for(k=i-1,l=j+1; k>=0 && j<8; k--,l++)//derecha, arriba
  79.                        if(ar[k][l] == 'r')reynegro=true;
  80.                        else if(ar[k][l] != '.')break;
  81.                    for(k=i+1,l=j+1; k<8 && l<8; k++,l++)//derecha, abajo
  82.                        if(ar[k][l] == 'r')reynegro=true;
  83.                        else if(ar[k][l] != '.')break;
  84.                }
  85.                else{
  86.                    for(k=i-1,l=j-1; k>=0 && l>=0; k--,l--)//izquierda, arriba
  87.                        if(ar[k][l] == 'R')reyblanco=true;
  88.                        else if(ar[k][l] != '.')break;
  89.                    for(k=i+1,l=j-1; k<8 && l>=0; k++,l--)//izquierda abajo
  90.                        if(ar[k][l] == 'R')reyblanco=true;
  91.                        else if(ar[k][l] != '.')break;
  92.                    for(k=i-1,l=j+1; k>=0 && j<8; k--,l++)//derecha, arriba
  93.                        if(ar[k][l] == 'R')reyblanco=true;
  94.                        else if(ar[k][l] != '.')break;
  95.                    for(k=i+1,l=j+1; k<8 && l<8; k++,l++)//derecha, abajo
  96.                        if(ar[k][l] == 'R')reyblanco=true;
  97.                        else if(ar[k][l] != '.')break;
  98.                }
  99.            }
  100.            if(ar[i][j]=='P' || ar[i][j]=='p'){ //peon
  101.                if(ar[i][j]=='P'){//si es mayuscula es pieza blanca sino negra
  102.                    if(ar[i+1][j-1]=='r' || ar[i+1][j+1]=='r')reynegro=true;
  103.                }
  104.                else{
  105.                     if(ar[i-1][j-1]=='R' || ar[i-1][j+1]=='R')reyblanco=true;
  106.                }
  107.            }
  108.        }
  109.    }
  110.    if(reyblanco)cout<<1; else cout<<0; // ya solo checo: si el reyblanco dio verdadero pongo que esta en jaque es decir un 1
  111.    cout<<"\n";
  112.    if(reynegro)cout<<1; else cout<<0;//hago lo mismo de arriba
  113. return 0; }
[/code]
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]


« Última modificación: 17 Junio 2016, 16:58 pm por KINGARZA » En línea

do-while


Desconectado Desconectado

Mensajes: 1.276


¿Habra que sacarla de paseo?


Ver Perfil
Re: Necesito tu ayuda, debo detectar un jaque en c++
« Respuesta #1 en: 17 Junio 2016, 14:42 pm »

Si no utilizas las etiquetas GeSHI (el desplegable que hay al final de la primera fila de iconos en el modo de edición) para el código es imposible descifrar lo que has puesto...


« Última modificación: 17 Junio 2016, 15:06 pm por do-while » En línea

- Doctor, confundo los números y los colores.
- Vaya marrón.
- ¿Marrón? ¡Por el culo te la hinco!
KINGARZA

Desconectado Desconectado

Mensajes: 33

Facebook: Luis Garza


Ver Perfil
Re: Necesito tu ayuda, debo detectar un jaque en c++
« Respuesta #2 en: 17 Junio 2016, 16:43 pm »

Si no utilizas las etiquetas GeSHI (el desplegable que hay al final de la primera fila de iconos en el modo de edición) para el código es imposible descifrar lo que has puesto...

perdonar, pero soy nuevo en este foro y no conocia esa herramienta, gracias.
En línea

do-while


Desconectado Desconectado

Mensajes: 1.276


¿Habra que sacarla de paseo?


Ver Perfil
Re: Necesito tu ayuda, debo detectar un jaque en c++
« Respuesta #3 en: 17 Junio 2016, 17:18 pm »

Parece que tu código es correcto, pero está incompleto.

Te falta comprobar si un rey amenaza a otro rey (en cuyo caso se amenazan mutuamente). Recuerda que según el enunciado simplemente se colocan piezas en el tablero, sin que éstas tengan que seguir las reglas del ajedrez.

Prueba a incluir ese caso y si aun así fallase muéstranos el tablero para el que el código no funcione.

¡Saludos!
« Última modificación: 17 Junio 2016, 17:22 pm por do-while » En línea

- Doctor, confundo los números y los colores.
- Vaya marrón.
- ¿Marrón? ¡Por el culo te la hinco!
KINGARZA

Desconectado Desconectado

Mensajes: 33

Facebook: Luis Garza


Ver Perfil
Re: Necesito tu ayuda, debo detectar un jaque en c++
« Respuesta #4 en: 17 Junio 2016, 21:07 pm »

Antes que nada gracias por responder (no pense que nadie responderia viendo tantas lineas de codigo) mira ya le añadi lo que dijiste donde solo basta con comparar con un rey
Código
  1.  
  2.           if(ar[i][j]=='R' ){                
  3.                    if(ar[i-1][j-1]=='r' || ar[i+1][j+1]=='r' || ar[i+1][j-1]=='r' || ar[i-1][j+1]=='r'
  4.                    || ar[i][j-1]=='r' || ar[i][j+1]=='r' || ar[i+1][j]=='r' || ar[i-1][j]=='r'){
  5.                        cout<<1<<"\n"<<1; return 0;                    
  6.                }
  7.            }
lamentablemente me sigue dando el mismo puntaje ademas lo peor (es por eso mi desesperación) no me dicen mis casos de error por que mis respuestas son enviadas a una platafotma llamada "omegaup" (aqui te dejo el link por si gustas checarlo para que veas que dal el 90%). https://omegaup.com/arena/problem/jaque#problems
« Última modificación: 17 Junio 2016, 21:13 pm por KINGARZA » En línea

do-while


Desconectado Desconectado

Mensajes: 1.276


¿Habra que sacarla de paseo?


Ver Perfil
Re: Necesito tu ayuda, debo detectar un jaque en c++
« Respuesta #5 en: 17 Junio 2016, 21:43 pm »

¡Buenas!

Ahora he visto algo más. Ni con el rey ni con los peones ni con el caballo compruebas que las coordenadas a las que accedes sean correctas, así que en los bordes accedes a posiciones de memoria que están fuera de la matriz y te dará errores de segmentación.

Antes de acceder a los datos tendrás que comprobar que las coordenadas estén dentro del rango 0-7.

¡Saludos!
En línea

- Doctor, confundo los números y los colores.
- Vaya marrón.
- ¿Marrón? ¡Por el culo te la hinco!
KINGARZA

Desconectado Desconectado

Mensajes: 33

Facebook: Luis Garza


Ver Perfil
Re: Necesito tu ayuda, debo detectar un jaque en c++
« Respuesta #6 en: 17 Junio 2016, 22:24 pm »

Gracias nuevamente, tienes mucha razon, lo voy a intentar pero la verdad no se me ocurre como jeje podrias darme un ejemplo? por favor abusando de tu amabilidad.
En línea

KINGARZA

Desconectado Desconectado

Mensajes: 33

Facebook: Luis Garza


Ver Perfil
Re: Necesito tu ayuda, debo detectar un jaque en c++
« Respuesta #7 en: 17 Junio 2016, 23:16 pm »

.
« Última modificación: 17 Junio 2016, 23:19 pm por KINGARZA » En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
necesito saber que debo hacer en el sgte caso.....
Multimedia
tomcat 3 1,429 Último mensaje 17 Enero 2005, 21:54 pm
por Songoku
Las claves RSA en jaque
Noticias
wolfbcn 6 2,863 Último mensaje 19 Febrero 2012, 19:31 pm
por dimitrix
necesito sofware para detectar direcciones MAC a mi alrededor « 1 2 3 »
Hacking Wireless
sanson 21 23,414 Último mensaje 2 Noviembre 2012, 17:03 pm
por ogeitga
Ayuda. Qué pasos debo seguir?
Hacking
MasterEticMonkey 5 2,009 Último mensaje 19 Julio 2012, 20:42 pm
por Squirtle
Ayuda y recomendacion sobre que debo comprar
Redes
lumier 3 1,192 Último mensaje 2 Julio 2013, 16:20 pm
por lumier
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines