Corso IN110 Algoritmi e Strutture Dati

Gli esercizi

Testi e soluzioni di alcuni esercizi

Cavalli e regine

Su una scacchiera (matrice quadrata di 8×8 elementi) sono disposti in modo casuale due cavalli neri, una regina nera ed n ≤ 16 pezzi bianchi. Scrivere una funzione che calcoli il numero di possibili mosse dei pezzi neri che consentono di mangiare un pezzo bianco.

/*
**  cavalli_regina.c
**
**  Su una scacchiera (8x8) sono disposti in modo random due
**  cavalli neri, una regina nera e n<=16 pezzi bianchi.
**  Scrivere una funzione che calcoli il numero di possibili
**  mosse dei pezzi neri che consentano di mangiare un pezzo
**  bianco.
**
**  Marco Liverani (liverani@mat.uniroma3.it) - Febbraio 1999
*/

#include <stdlib.h>
#include <stdio.h>
#include <time.h>


/*
**  disponi_pezzi
**
**  colloca in modo casuale i pezzi sulla scacchiera,
**  evitando di collocarne due nella stessa posizione.
*/

int disponi_pezzi(int *m) {
  int n, i, j, x, y;

  srand((unsigned) time(NULL));
  n = rand() % 14 +2;

  for (i=0; i<8; i++) {
    for (j=0; j<8; j++) {
      *(m + i*8 +j) = 0;
    }
  }

  /* definisco la posizione del primo cavallo nero */
  x = rand() % 8;
  y = rand() % 8;
  *(m + x*8 +y) = 1;

  /* definisco la posizione del secondo cavallo nero */
  do {
    x = rand() % 8;
    y = rand() % 8;
  } while (*(m + x*8 + y) != 0);
  *(m + x*8 +y) = 1;

  /* definisco la posizione della regina nera */
  do {
    x = rand() % 8;
    y = rand() % 8;
  } while (*(m + x*8 + y) != 0);
  *(m + x*8 +y) = 2;

  /* definisco la posizione dei pezzi bianchi */
  for (i=0; i<n; i++) {
    do {
      x = rand() % 8;
      y = rand() % 8;
    } while (*(m + x*8 + y) != 0);
    *(m + x*8 + y) = 3;
  }

  return(n);
}


/*
**  calcola
**
**  calcola le possibili mosse di tutti pezzi neri e
**  verifica la possibilita` che tali mosse consentano
**  di mangiare un pezzo bianco.
*/

void calcola(int *m) {
  int i, j, x, y;

  for (i=0; i<8; i++) {
    for (j=0; j<8; j++) {
      if (*(m + i*8 +j) == 1) {
        if (i>1 && j>1 && *(m + (i-2)*8 + j-1) == 3) {
          printf("Cavallo da (%d,%d) a (%d,%d)\n", i, j, i-2, j-1);
        }
        if (i>1 && j<7 && *(m + (i-2)*8 + j+1) == 3) {
          printf("Cavallo da (%d,%d) a (%d,%d)\n", i, j, i-2, j+1);
        }
        if (i>0 && j<6 && *(m + (i-1)*8 + j+2) == 3) {
          printf("Cavallo da (%d,%d) a (%d,%d)\n", i, j, i-1, j+2);
        }
        if (i<7 && j<6 && *(m + (i+1)*8 + j+2) == 3) {
          printf("Cavallo da (%d,%d) a (%d,%d)\n", i, j, i+1, j+2);
        }
        if (i<6 && j<7 && *(m + (i+2)*8 + j+1) == 3) {
          printf("Cavallo da (%d,%d) a (%d,%d)\n", i, j, i+2, j+1);
        }
        if (i<6 && j>0 && *(m + (i+2)*8 + j-1) == 3) {
          printf("Cavallo da (%d,%d) a (%d,%d)\n", i, j, i+2, j-1);
        }
        if (i<7 && j>1 && *(m + (i+1)*8 + j-2) == 3) {
          printf("Cavallo da (%d,%d) a (%d,%d)\n", i, j, i+1, j-2);
        }
        if (i>0 && j>1 && *(m + (i-1)*8 + j-2) == 3) {
          printf("Cavallo da (%d,%d) a (%d,%d)\n", i, j, i-1, j-2);
        }
      }
      if (*(m + i*8 + j) == 2) {
        x = i;
        y = j;
        do {
          x--;
        } while (x>=0 && *(m + x*8 + y) == 0);
        if (x>=0 && *(m + x*8 + y) == 3) {
          printf("Regina da (%d,%d) a (%d,%d)\n", i, j, x, y);
        }

        x = i;
        y = j;
        do {
          y--;
        } while (y>=0 && *(m + x*8 + y) == 0);
        if (y>=0 && *(m + x*8 + y) == 3) {
          printf("Regina da (%d,%d) a (%d,%d)\n", i, j, x, y);
        }

        x = i;
        y = j;
        do {
          y++;
        } while (y<8 && *(m + x*8 + y) == 0);
        if (y<8 && *(m + x*8 + y) == 3) {
          printf("Regina da (%d,%d) a (%d,%d)\n", i, j, x, y);
        }

        x = i;
        y = j;
        do {
          x++;
        } while (x<8 && *(m + x*8 + y) == 0);
        if (x<8 && *(m + x*8 + y) == 3) {
          printf("Regina da (%d,%d) a (%d,%d)\n", i, j, x, y);
        }

        x = i;
        y = j;
        do {
          x++;
          y++;
        } while (x<8  && y<8 && *(m + x*8 + y) == 0);
        if (x<8 && y<8 && *(m + x*8 + y) == 3) {
          printf("Regina da (%d,%d) a (%d,%d)\n", i, j, x, y);
        }

        x = i;
        y = j;
        do {
          x++;
          y--;
        } while (x<8  && y>=0 && *(m + x*8 + y) == 0);
        if (x<8 && y>=0 && *(m + x*8 + y) == 3) {
          printf("Regina da (%d,%d) a (%d,%d)\n", i, j, x, y);
        }

        x = i;
        y = j;
        do {
          x--;
          y--;
        } while (x>=0  && y>=0 && *(m + x*8 + y) == 0);
        if (x>=0 && y>=0 && *(m + x*8 + y) == 3) {
          printf("Regina da (%d,%d) a (%d,%d)\n", i, j, x, y);
        }

        x = i;
        y = j;
        do {
          x--;
          y++;
        } while (x>=0  && y<8 && *(m + x*8 + y) == 0);
        if (x>=0 && y<8 && *(m + x*8 + y) == 3) {
          printf("Regina da (%d,%d) a (%d,%d)\n", i, j, x, y);
        }
      }
    }
  }
  return;
}


/*
**  stampa_matrice
**
**  stampa la scacchiera: 0=posizione vuota,
**  1=cavallo nero, 2=regina nera, 3=pezzo bianco.
*/

void stampa_matrice(int *m) {
  int i, j;
  for (i=0; i<8; i++) {
    for (j=0; j<8; j++) {
      printf("%2d", *(m + i*8 + j));
    }
    printf("\n");
  }
  return;
}

/*
**  main
**
**  funzione principale che richiama tutte le altre.
*/

int main(void) {
  int m[8][8];

  disponi_pezzi(&m[0][0]);
  stampa_matrice(&m[0][0]);
  calcola(&m[0][0]);
  return(0);
}

Università degli Studi Roma Tre - Dipartimento di Matematica e Fisica - Corso di laurea in Matematica - Corso di Informatica 1 (IN110)

Author: Marco Liverani - Last modified: Saturday July 13, 2019 - URI: http://www.mat.uniroma3.it/users/liverani/IN1/19990205c.shtml