Submission #1248281

#TimeUsernameProblemLanguageResultExecution timeMemory
1248281yookwiSandwich (JOI16_sandwich)C++20
100 / 100
4742 ms26856 KiB
#include<bits/stdc++.h>
using namespace std;
typedef long long lg;
typedef long double ld;
#define INF 500'000'000'000'000'000
#define pii pair<lg,lg>
#define ff first
#define ss second

lg n,m,k,t;
//Z는 0, N은 1
lg arr1[405][405];
lg arr2[405][405];
lg arr3[405][405];
lg arr4[405][405];

//왼쪽 방향으로 접근 1, 오른쪽 방향으로 접근 2
lg vis[405][405];
lg dfsvis[405][405];

lg ans[405][405];
lg ans1[405][405];
lg ans2[405][405];
lg ans3[405][405];
lg ans4[405][405];

lg dy[4] = {0,0,1,-1};
lg dx[4] = {-1,1,0,0};

lg pos = 0;
lg viscnt = 0;

void dfs(lg y,lg x, lg arr[405][405]){
    //현재 y와 x에 있다.
    //다음을 방문하자.
    lg dir1, dir2;

    if(arr[y][x] == 0){
        if(vis[y][x] == 1){
            // 왼쪽, 위
            dir1 = 0;
            dir2 = 3;
        }
        else{
            // 오른쪽, 아래
            dir1 = 1;
            dir2 = 2;
        }
    }
    else{
        if(vis[y][x] == 1){
            // 왼쪽, 아래 
            dir1 = 0;
            dir2 = 2;
        }
        else{
            // 오른쪽, 위
            dir1 = 1;
            dir2 = 3;
        }
    }

    lg ny1 = y + dy[dir1], nx1 = x + dx[dir1];
    lg ny2 = y + dy[dir2], nx2 = x + dx[dir2];

    if(dfsvis[ny1][nx1] == 1){
        pos = 0;
        return;
    }
    if(dfsvis[ny2][nx2] == 1){
        pos = 0;
        return;
    }

    //수평 방향 이동
    if(1 <= ny1 && ny1 <= n && 1 <= nx1 && nx1 <= m){
        if(vis[ny1][nx1] == 0){
            vis[ny1][nx1] = vis[y][x];
            viscnt++;

            dfsvis[ny1][nx1] = 1;
            dfs(ny1, nx1, arr);
            dfsvis[ny1][nx1] = 0;
        }
        else if(vis[ny1][nx1] != vis[y][x]){
            pos = 0;
            return;
        }
    }

    //수직 방향 이동
    if(1 <= ny2 && ny2 <= n && 1 <= nx2 && nx2 <= m){
        if(vis[ny2][nx2] == 0){
            vis[ny2][nx2] = (arr[ny2][nx2] == arr[y][x] ? vis[y][x] : 3 - vis[y][x]);
            viscnt++;

            dfsvis[ny2][nx2] = 1;
            dfs(ny2, nx2, arr);
            dfsvis[ny2][nx2] = 0;
        }
        else if(vis[ny2][nx2] != (arr[ny2][nx2] == arr[y][x] ? vis[y][x] : 3 - vis[y][x])){
            pos = 0;
            return;
        }
    }
}

void f(lg arr[405][405], lg ans[405][405]){
    //N이 왼쪽으로 뻣어나가는 것을 처리하자.
    for(lg i=1;i<=n;i++){
        for(lg y=1;y<=n;y++){
            for(lg x=1;x<=m;x++){
                vis[y][x] = 0;
            }
        }
        pos = 1;
        viscnt = 0;
        for(lg j=1;j<=m;j++){
            if(arr[i][j] == 0) continue; //Z라면 넘긴다.
            //현재가 방문되었다면 사이클이 존재하는 것이므로 뒤도 안된다.
            if(vis[i][j] != 0) break;

            vis[i][j] = 1;
            viscnt++;
            dfsvis[i][j] = 1;
            dfs(i, j, arr);
            dfsvis[i][j] = 0;

            if(pos == 0) break;
            ans[i][j] = viscnt;
        }
    }
}

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

    cin >> n >> m;
    for(lg i=1;i<=n;i++){
        string s;
        cin >> s;
        for(lg j=1;j<=m;j++){
            if(s[j-1] == 'N') arr1[i][j] = 1;
        }
    }
    for(lg i=1;i<=n;i++){
        for(lg j=1;j<=m;j++){
            ans1[i][j] = INF;
            ans2[i][j] = INF;
            ans3[i][j] = INF;
            ans4[i][j] = INF;
        }
    }
    for(lg i=1;i<=n;i++){
        for(lg j=1;j<=m;j++){
            arr2[i][j] = 1-arr1[n-i+1][j];
            arr3[i][j] = 1-arr1[i][m-j+1];
            arr4[i][j] = arr1[n-i+1][m-j+1];
        }
    }
    f(arr1, ans1);
    f(arr2, ans2);
    f(arr3, ans3);
    f(arr4, ans4);
    for(lg i=1;i<=n;i++){
        for(lg j=1;j<=m;j++){
            lg curans = min({ans1[i][j], ans2[n-i+1][j], ans3[i][m-j+1], ans4[n-i+1][m-j+1]});
            if(curans == INF){
                cout <<"-1 ";
            }
            else{
                cout << curans * 2 <<" ";
            }
        }
        cout <<"\n";
    }
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...