天天看點

hdu 5319 Painter(15多校第三場1004)

#include<cstdio>
#include<cstring>
#include<algorithm>
#include <iostream>
using namespace std;
char map[100][100];
bool vis[100][100];
int D1[2][2]={{1,1},{-1,-1}};
int D2[2][2]={{1,-1},{-1,1}};
int n,m;
bool check(int x,int y){
    if(x<0||y<0||x>=n||y>=m)return 0;
    return 1;
}
void dfs1(int x,int y){
    vis[x][y]=1;
    int xx=x,yy=y;
    while(check(xx+D1[0][0],yy+D1[0][1])){
        xx+=D1[0][0];yy+=D1[0][1];
        if(map[xx][yy]=='B'||map[xx][yy]=='.')break;
        if(map[xx][yy]=='G')map[xx][yy]='B';
        else vis[xx][yy]=1;
    }
    xx=x,yy=y;
    while(check(xx+D1[1][0],yy+D1[1][1])){
        xx+=D1[1][0];yy+=D1[1][1];
        if(map[xx][yy]=='B'||map[xx][yy]=='.')break;
        if(map[xx][yy]=='G')map[xx][yy]='B';
        else vis[xx][yy]=1;
    }
}
void dfs2(int x,int y){
    vis[x][y]=1;
    int xx=x,yy=y;
    while(check(xx+D2[0][0],yy+D2[0][1])){
        xx+=D2[0][0];yy+=D2[0][1];
        if(map[xx][yy]=='R'||map[xx][yy]=='.')break;
        if(map[xx][yy]=='G')map[xx][yy]='R';
        else vis[xx][yy]=1;
    }
    xx=x,yy=y;
    while(check(xx+D2[1][0],yy+D2[1][1])){
        xx+=D2[1][0];yy+=D2[1][1];
        if(map[xx][yy]=='R'||map[xx][yy]=='.')break;
        if(map[xx][yy]=='G')map[xx][yy]='R';
        else vis[xx][yy]=1;
    }
}
int main(){
    int T;
    scanf("%d",&T);
    while(T--){
        scanf("%d",&n);
        memset(map,0,sizeof(map));
        for(int i=0;i<n;i++)
            scanf("%s",map[i]);
        
        m=strlen(map[0]);
        memset(vis,0,sizeof(vis));
        int cnt=0;
        for(int i=0;i<n;i++){
            for(int j=0;j<m;j++){
                if(!vis[i][j]&&map[i][j]!='.'){
                    cnt++;
                    if(map[i][j]=='R'){
                        dfs1(i,j);
                    }
                    else if(map[i][j]=='B'){
                        dfs2(i,j);
                    }
                    else if(map[i][j]=='G'){
                        cnt++;
                        dfs1(i,j);dfs2(i,j);
                    }
                }
            }
        }
        printf("%d\n",cnt);
    }
    return 0;
}
           

繼續閱讀