Corso di Informatica Generale - Primo modulo IN1

Testi e soluzioni di esercizi

 

Cavalli e regine

/*
**	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(1);
}

Per informazioni e commenti: liverani@mat.uniroma3.it - Torna alla Home page - Ultima modifica: 18 Marzo 2001