/
Inicio :: Foros

 F.A.Q.F.A.Q.                  Conéctese para revisar sus mensajesConéctese para revisar sus mensajes   

Recorrer matriz Diagonalmente (juego de alfiles)

 
      Índice del Foro elrincondelc.com -> Algoritmos
Ver tema anterior :: Ver siguiente tema  
AutorMensaje
Lukitas12



Registrado: 14 Feb 2012
Mensajes: 2

MensajePublicado: 14/02/2012 11:49 am
Título: Recorrer matriz Diagonalmente (juego de alfiles)

Me plantearon este problema:
Juego "tipo ajedrez".
Se diagrama un tablero de nxn. Determinando n por usuario. Minimo n=4.

Se ingresa la posicion de n alfiles al tablero.

Determinar si existe posibilidad de que algun alfil coma a otro.

Lo que me vino a la cabeza fue lo siguiente:

Código:


#include <stdio.h>
#include <stdlib.h>
#define MAX 100
int crear_matriz(int M[][MAX]);
void imprimir_matriz(int M[][MAX], int n);
void nuevo_juego(int M[][MAX], int n);
int analizar_juego(int M[][MAX],int n);

int main()
{
    printf("Hello world!\n");
    int M[MAX][MAX];
    int n,resultado;

    n=crear_matriz(M);
    imprimir_matriz(M,n);
    nuevo_juego(M,n);
    imprimir_matriz(M,n);
    resultado=analizar_juego(M,n);

    printf("\nResultado arrojo el numero %d",resultado);

    return 0;
}
int crear_matriz(int M[][MAX])
{
    int n=0, i,j;

    puts("Ingrese el tamano de la matriz");
    scanf("%d",&n);

    for(i=0;i<n;i++)
    {
        for(j=0;j<n;j++)
        {M[i][j]=0;}
    }
    return n;
}
void imprimir_matriz(int M[][MAX], int n)
{
    int i=0,j=0;

    for(i=0;i<n;i++)
    {   printf("\n");
        for(j=0;j<n;j++)
        {printf("%d",M[i][j]);}
    }

}
void nuevo_juego(int M[][MAX], int n)
{
    int i,j,k;
    printf("\n\nDebe colocar %d alfiles",n);
    for(k=0;k<n;k++)
    {
        printf("\nDel 0 al %d elija la posicion 'i':",n-1);
        scanf("%d",&i);
        printf("\nDel 0 al %d elija la posicion 'j':",n-1);
        scanf("%d",&j);
        M[i][j]++;

        printf("\nSiguiente reina\n");
    }

    puts("\nSe han colocado todos los alfiles");
}
int analizar_juego(int M[][MAX],int n)
{
    int i,j,k;
    int *diagS,*diagI;
    int tam;
    tam=((n*2)-3);
    diagS=(int*)malloc(sizeof(int)*tam); // diagS "diagonales de izq a derecha"
    diagI=(int*)malloc(sizeof(int)*tam); // diagI " diagonales de derecha a izq "
    for(k=0;k<tam;k++)
    {
        diagI[k]=0;
        diagS[k]=0;
    }
    for(i=0;i<n;i++)
    {
        for(j=0;j<n;j++)
        {
            if(M[i][j]==1)
            {
                if(i==j)diagI[0]++;

                for(k=1;k<=tam;k++)
                {
                   if(i+j==k)diagS[k-1]++;
                }
                for(k=1;k<=(n-2);k++)
                {
                    if((i-j)==k)diagI[k]++;
                    if((j-i)==k)diagI[(n-2)+k]++;
                }
            }
        }
    }
    puts("\n");
    puts("diagI:");for(k=0;k<tam;k++)printf("%d ",diagI[k]);
    puts("\ndiagS:");for(k=0;k<tam;k++)printf("%d ",diagS[k]);
    puts("\n");

    for(k=0;k<tam;k++)
    {
        if(diagI[k]>=2||diagS[k]>=2)
        {
            printf("\n\nNO CUMPLE CONDICION\n\n");
            getchar();
            return 0;
        }
    }


return (1);
}


Explicación: creo la matriz, ingreso un ejemplo.

Luego analizar_juego determina: 0 "si alfiles se comen".
1 "no se comen".

Para hacer esto uso 2 vectores de enteros, el tamaño de los vectores depende de cuantas diagonales "utiles" hay dependiendo de cuan grande es el tablero y por lo tanto alfiles en juego.

Hago todo esto porque no se recorrer la matriz diagonalmente. Uso el ciclo clasico de Nor-oeste a Sud-este.

Este ejercicio supongo estaba destinado a recorrer la matriz bidimensional diagonalmente.

Alguno me puede ayudar a entender como hacer esto de manera mas eficiente y facil. Esto parece que me salio demasiado rebuscado.


PD: Hago prints de las matrices y los vectores para hacer más facil el seguimiento mientras programaba.
Muchas gracias de antemano.
Volver arriba
cheroky



Registrado: 22 Sep 2005
Mensajes: 2556
Ubicación: Valladolid (España)

MensajePublicado: 15/02/2012 9:55 pm
Título:

Hola.

Por falta de tiempo no he revisado el código fuente, y ciertamente, sí parece que se dan demasiados rodeos para el objetivo.

No obstante en cuanto a buscar un algoritmo más eficiente no resulta difícil inferir que dadas las coordenadas cartesianas de dos piezas si y sólo si se cumple que si estas se capturan en la diagonal, por tanto se puede aplicar un método numérico.


·?0ƒ·
_________________
La cuestión no es si hay vida inteligente en otros planetas lejanos. La cuestión es si hay vida inteligente aquí.
Volver arriba
Lukitas12



Registrado: 14 Feb 2012
Mensajes: 2

MensajePublicado: 21/02/2012 11:13 am
Título:

gracias por la respuesta, justo lo que necesitaba.
Volver arriba
      Índice del Foro elrincondelc.com -> Algoritmos
Página 1 de 1Todas las horas están en GMT - 8 Horas

 
No puede crear mensajes
No puede responder temas
No puede editar sus mensajes
No puede borrar sus mensajes
No puede votar en encuestas

(c) ElRincondelC.com

Un proyecto de UrlanHeat.com