#include #include #include #define PLUS_INFTY 1000000000 #define MINUS_INFTY -1000000000 char **genmatrix ( int m, int n ) { char **M, prev; int i, j; M = (char **)malloc(m * sizeof(char *)); for (i=0; i= i) && (u < i+k) && (v >= j) && (v < j+l)) printf("%c ", M[u][v]); else printf(". "); } printf("\n"); } } int ischessboard ( char **M, int i, int j, int k, int l ) { int u, v; char prev; prev = (M[i][j] == 'W') ? 'B' : 'W'; for (u=i; u=1; --l) { if (ischessboard(M,i,j,l,l)) break; } if (l >= lmax) { imax = i; jmax = j; lmax = l; } } } printf("\n+++ Exhaustive search: Square\n"); prnblock(M,m,n,imax,jmax,lmax,lmax); printf(" Area = %d\n", lmax*lmax); } void esrectangle ( char **M, int m, int n ) { int i, j, imax, jmax, K, k, L, l, kmax, lmax, Amax; Amax = MINUS_INFTY; for (i=0; i=1; --k) { for (l=L; l>=1; --l) { if (ischessboard(M,i,j,k,l)) break; } if (k*l > Amax) { imax = i; jmax = j; kmax = k; lmax = l; Amax = k*l; } } } } printf("\n+++ Exhaustive search: Rectangle\n"); prnblock(M,m,n,imax,jmax,kmax,lmax); printf(" Area = %d\n", Amax); } void dpsquare ( char **M, int m, int n ) { int i, j, l1, l2, imax, jmax, lmax; int **L; L = (int **)malloc(m * sizeof(int *)); for (i=0; i=0; --i) { for (j=n-2; j>=0; --j) { if ((M[i][j] == M[i+1][j]) || (M[i][j] == M[i][j+1])) L[i][j] = 1; else { l1 = L[i+1][j]; l2 = L[i][j+1]; if (l1 < l2) L[i][j] = l1 + 1; else if (l1 > l2) L[i][j] = l2 + 1; else if (M[i+l1][j+l2] != M[i+l1][j+l2-1]) L[i][j] = l1 + 1; else L[i][j] = l1; } if (L[i][j] > lmax) { imax = i; jmax = j; lmax = L[i][j]; } } } for (i=0; i=0; --j) L[i][j] = (M[i][j] == M[i][j+1]) ? 1 : L[i][j+1] + 1; } for (j=0; j=0; --i) K[i][j] = (M[i][j] == M[i+1][j]) ? 1 : K[i+1][j] + 1; } Amax = MINUS_INFTY; for (i=0; i Amax) { imax = i; jmax = j; kmax = k; lmax = l; Amax = k * l; } } } } for (i=0; i