CCCPaste

Miting OJI X 2016

#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 <