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); }