#include #include #include #include using namespace std; ifstream cin("miting.in"); ofstream cout("miting.out"); queue> q; int di[] = {0,0,1,-1}, dj[] = {1,-1,0,0}; char mat[101][101], cuv[11]; int dp[11][11][61][61],visited[61][61]; const int inf = 1e9; int cerinta, n ,m; pair poz[11]; int index(char c) { return (strchr(cuv,c) - cuv) + 1 ; } int main() { cin >> cerinta >> n >> m >> cuv; for(int i = 1;i<=n;i++) for(int j = 1;j<=m;j++) cin >> mat[i][j]; if(cerinta == 1) { int xi=inf, yi=inf, xf=-inf, yf=-inf; for(int i = 1;i<=n;i++) for(int j = 1;j<=m;j++) if(mat[i][j]!= '#' && mat[i][j]!='_') { xi = min(xi,i); yi = min(yi,j); xf = max(xf,i); yf = max(yf,j); } cout << (xf - xi + 1) * (yf - yi + 1); return 0; } /// Initializam vectorul dp[][][][] cu valori mari.. int cuvLen = strlen(cuv); for(int i = 1;i<=cuvLen;i++) for(int j = 1;j<=cuvLen;j++) for(int k = 1;k<=n;k++) for(int l = 1;l<=m;l++) dp[i][j][k][l] = 1e9; /// Salvam pozitiile literelor in poz. for(int i = 1;i<=n;i++) for(int j = 1;j<=m;j++) if(mat[i][j] != '#' && mat[i][j]!='_') poz[index(mat[i][j])] = {i,j}; /// Facem un lee pornind din fiecare litera. for(int i = 1;i<=cuvLen;i++) { q.push(poz[i]); int x = poz[i].first, y = poz[i].second; dp[i][i][x][y] = 0; while(!q.empty()) { x = q.front().first; y = q.front().second; for(int k = 0; k<4;k++) { int cx = x + di[k]; int cy = y + dj[k]; if(cx < 1 || cy < 1 || cx > n || cy > m) continue; if(mat[cx][cy] == '#' || dp[i][i][cx][cy] <= dp[i][i][x][y]) continue; dp[i][i][cx][cy] = dp[i][i][x][y] + 1; /// Daca elementul este deja in coada nu are rost sa il pun iar. if(!visited[cx][cy]) q.push({cx,cy}),visited[cx][cy] = true; } q.pop(); visited[x][y] = false; } } /// Afisarea acestor matrici : /*for(int i = 1;i<=cuvLen;i++,cout<<'\n') { cout << "MAT " << i << ":\n"; for(int j = 1;j<=n;j++,cout<<'\n') for(int k = 1;k<=m;k++) { if(dp[i][i][j][k] == 1e9) cout <