Submission #1261615

#TimeUsernameProblemLanguageResultExecution timeMemory
1261615k12_khoiRobots (APIO13_robots)C++17
60 / 100
424 ms229376 KiB
#include <bits/stdc++.h>
using namespace std;
#define pii pair<int,int>
#define piiii pair<pii,pii>
#define X first
#define Y second

const int N=505;
const int K=12;
const int oo=1e9+1;

int n,m,k,mx_dist,l,r,u,v,x,y,d[K][K][N][N];
int dx[]={1,0,0,-1},dy[]={0,1,-1,0};
int A[]={1,3,0,2},C[]={2,0,3,1};
pii nxt[N][N][5];
bool visited[N][N][5];
char s[N][N];

vector <piiii> ve[N*N];

pii dfs(int u,int v,int dir)
{
    if (s[u][v]=='A') dir=A[dir];
    if (s[u][v]=='C') dir=C[dir];

    if (nxt[u][v][dir]!=make_pair(0,0)) return nxt[u][v][dir];


    if (visited[u][v][dir]) return nxt[u][v][dir]=make_pair(-1,-1);
    visited[u][v][dir]=true;


    if (s[u+dx[dir]][v+dy[dir]]=='x') return nxt[u][v][dir]=make_pair(u,v);

    return nxt[u][v][dir]=dfs(u+dx[dir],v+dy[dir],dir);
}

int dial()
{
    mx_dist=0;
    for (int dist=0;dist<=mx_dist;dist++)
    {
        for (int i=0;i<ve[dist].size();i++)
        {
            l=ve[dist][i].X.X;
            r=ve[dist][i].X.Y;
            u=ve[dist][i].Y.X;
            v=ve[dist][i].Y.Y;

//            cout << l << ' ' << r << ' ' << u << ' ' << v << ' ' << dist << ' ' << mx_dist << endl;

            if (l==1 and r==k)
            {
                for (int j=dist;j<=mx_dist;j++)
                ve[j].clear();

                return dist;
            }

            if (dist>d[l][r][u][v]) continue;


            for (int i=l-1;i>=1;i--)
            if (d[i][r][u][v]>d[l][r][u][v]+d[i][l-1][u][v])
            {
                d[i][r][u][v]=d[l][r][u][v]+d[i][l-1][u][v];
                ve[d[i][r][u][v]].push_back(make_pair(make_pair(i,r),make_pair(u,v)));

                mx_dist=max(mx_dist,d[i][r][u][v]);
            }


            for (int j=r+1;j<=k;j++)
            if (d[l][j][u][v]>d[l][r][u][v]+d[r+1][j][u][v])
            {
                d[l][j][u][v]=d[l][r][u][v]+d[r+1][j][u][v];
                ve[d[l][j][u][v]].push_back(make_pair(make_pair(l,j),make_pair(u,v)));

                mx_dist=max(mx_dist,d[l][j][u][v]);
            }


            for (int dir=0;dir<=3;dir++)
            {
                pii j=nxt[u][v][dir];

                if (j!=make_pair(-1,-1) and d[l][r][j.X][j.Y]>dist+1)
                {
                    d[l][r][j.X][j.Y]=dist+1;
                    ve[d[l][r][j.X][j.Y]].push_back(make_pair(make_pair(l,r),make_pair(j.X,j.Y)));

                    mx_dist=max(mx_dist,d[l][r][j.X][j.Y]);
                }
            }
        }

        ve[dist].clear();
    }

    return -1;
}

int main()
{
    ios_base::sync_with_stdio(NULL);
    cin.tie(NULL); cout.tie(NULL);

    cin >> k >> m >> n;
    for (int i=0;i<=n+1;i++)
    s[i][0]=s[i][m+1]='x';

    for (int j=0;j<=m+1;j++)
    s[0][j]=s[n+1][j]='x';

    for (int i=1;i<=n;i++)
    for (int j=1;j<=m;j++)
    cin >> s[i][j];


    for (int i=1;i<=n;i++)
    for (int j=1;j<=m;j++)
    for (int dir=0;dir<=3;dir++)
    if (s[i][j]!='x') dfs(i,j,dir);

    for (int l=1;l<=k;l++)
    for (int r=l;r<=k;r++)
    for (int i=1;i<=n;i++)
    for (int j=1;j<=m;j++)
    d[l][r][i][j]=oo;


    for (int i=1;i<=n;i++)
    for (int j=1;j<=m;j++)
    if (s[i][j]>'0' and s[i][j]<=k+'0')
    {
        int id=s[i][j]-'0';
        d[id][id][i][j]=0;
        ve[0].push_back(make_pair(make_pair(id,id),make_pair(i,j)));
    }


    cout << dial();
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...