제출 #1150987

#제출 시각아이디문제언어결과실행 시간메모리
1150987koukirocksDango Maker (JOI18_dango_maker)C++20
13 / 100
38 ms71240 KiB
#include <bits/stdc++.h>
#define speed ios_base::sync_with_stdio(0); cin.tie(0)
#define all(x) x.begin(), x.end()
#define F first
#define S second

using namespace std;
typedef long long ll;
typedef pair<int,int> pii;
typedef pair<ll,ll> pll;

const ll oo=0x3f3f3f3f3f3f3f3f;

const int dir[2][2]={{0,1},{1,0}};
char mp[3010][3010];
int vis[3010][3010][2];
string s="RGW";
int n,m;

bool is(int i,int j,int d) {
    // cout<<i<<" "<<j<<" "<<d<<" ijd\n";
    if (i<=0 or j<=0) return false;
    bool flag=true;
    for (int k=0;k<=2;k++) {
        // cout<<k<<" k\n";
        if (i>n or j>m) return false;
        flag&=(mp[i][j]==s[k]);
        // cout<<i<<" "<<j<<" "<<mp[i][j]<<" "<<s[k]<<" ij mp s\n";
        i+=dir[d][0];j+=dir[d][1];
    }
    return flag;
}

struct Node {
    int x,y,d;
};

int BFS(int x,int y,int d) {
    queue<Node> Q;
    int cnt[2]={0,0};
    Q.push({x,y,d});
    vis[x][y][d]=true;
    while (!Q.empty()) {
        Node v=Q.front();
        Q.pop();
        // cout<<v.x<<" "<<v.y<<" "<<v.d<<" v\n";
        int rd=1-v.d;
        cnt[v.d]++;
        for (int k=0;k<=2;k++) {
            int nx=v.x+k*(dir[v.d][0]-dir[rd][0]);
            int ny=v.y+k*(dir[v.d][1]-dir[rd][1]);
            if (nx<=0 or ny<=0) continue;
            if (vis[nx][ny][rd]) continue;
            if (is(nx,ny,rd)) {
                Q.push({nx,ny,rd});
                vis[nx][ny][rd]=true;
            }
        }
    }
    // cout<<"\n";
    return max(cnt[0],cnt[1]);
}

int main() {
    speed;
    cin>>n>>m;
    for (int i=1;i<=n;i++) {
        for (int j=1;j<=m;j++) {
            cin>>mp[i][j];
        }
    }
    ll ans=0;
    // for (int i=1;i<=n;i++) {
    //     for (int j=1;j<=m;j++) {
    //         cout<<mp[i][j]<<" ";
    //     }
    // }
    // cout<<is(1,1,0)<<" "<<is(1,1,1)<<" is\n";
    memset(vis,0,sizeof(vis));
    for (int i=1;i<=n;i++) {
        for (int j=1;j<=m;j++) {
            for (int d=0;d<=1;d++) {
                if (vis[i][j][d]) continue;
                if (is(i,j,d)) {
                    ans+=BFS(i,j,d);
                }
            }
        }
    }
    cout<<ans<<"\n";
    return 0;
}





/*
10 10
RGRWGRWRGR
GWGRWGRGGG
RGWRWGRRGW
WGRWGRWGRW
GWRGWRGWRW
GRWGRWRWGR
GWRGWRGWGW
RGRRGWRRGR
GWGGWRGGGG
RGWRGWRRGW
*/

#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...