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