/*
** matrici.c
**
** Generare in modo casuale una matrice A di ordine 10x15, con valori
** interi 0 e 1. Sia B la seguente matrice quadrata di ordine 3:
** | 0 1 0 |
** B = | 1 1 1 |
** | 0 1 0 |
** Verificare se in A e' possibile collocare B in modo tale che nessun
** elemento di valore 1 di B si vada a sovrapporre ad un elemento di
** valore 1 in A. In caso affermativo stampare le coordinate di riga e
** di colonna in A in cui verrebbe collocato l'elemento B(0,0).
**
** Marco Liverani (liverani@mat.uniroma3.it) - Giugno 2001
*/
#include <stdlib.h>
#include <stdio.h>
#include <time.h>
#define RIGHE 10
#define COLONNE 15
void genera(int A[RIGHE][COLONNE]) {
int i, j;
srand((unsigned)time(NULL));
for (i=0; i<RIGHE; i++) {
for (j=0; j<COLONNE; j++) {
A[i][j] = rand()%2;
}
}
return;
}
int verifica(int A[RIGHE][COLONNE], int B[3][3], int *x, int *y) {
int i, j, h, k, flag;
flag = 0;
for (i=0; i<RIGHE-2 && flag==0; i++) {
for (j=0; j<COLONNE-2 && flag==0; j++) {
flag = 1;
for (h=0; h<3 && flag==1; h++)
for (k=0; k<3 && flag==1; k++)
if (B[h][k] == 1 && A[i+h][j+k] == 1)
flag = 0;
}
}
if (flag) {
*x = j;
*y = i;
}
return(flag);
}
void stampa_matrice(int A[RIGHE][COLONNE]) {
int i, j;
for (i=0; i<RIGHE; i++) {
for (j=0; j<COLONNE; j++)
printf("%d ", A[i][j]);
printf("\n");
}
return;
}
int main(void) {
int A[RIGHE][COLONNE], B[3][3], x, y;
B[0][0] = 0; B[0][1] = 1; B[0][2] = 0;
B[1][0] = 1; B[1][1] = 1; B[1][2] = 1;
B[2][0] = 0; B[2][1] = 1; B[2][2] = 0;
genera(A);
stampa_matrice(A);
if (verifica(A, B, &x, &y)) {
printf("La matrice B si incastra in A collocandola");
printf("a partire dalla posizione (%d,%d).\n", y, x);
} else {
printf("La matrice B non si incastra nella matrice A.\n");
}
return(1);
}