2 4 RR.B .RG. .BRR B..R 4 RRBB RGGB BGGR BBRR
3 6
扫描的时候把G看成B和R的组合。
遇到R或G的时候,向两个方向扫,同时把G变成B。
遇到B或G的时候,同理。
重复扫两遍
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #include<queue> #include<vector> #include<map> #include<set> #include<cmath> #define ll long long using namespace std; char Map[60][60]; int vis[60][60]; int n,m; int in(int x,int y) { if(x>=0&&x<n&&y>=0&&y<m) return 1; return 0; } int sao(int xx,int yy,int c) { int x,y; if(c==1) { x = xx; y = yy; while(1) { if(in(x+1,y+1)&&!vis[x+1][y+1]) { if(Map[x+1][y+1]=='R') { vis[x+1][y+1] = 1; x++,y++; } else if(Map[x+1][y+1]=='G') { Map[x+1][y+1]='B'; x++,y++; } else break; } else break; } x = xx; y = yy; while(1) { if(in(x-1,y-1)&&!vis[x-1][y-1]) { if(Map[x-1][y-1]=='R') { vis[x-1][y-1] = 1; x--,y--; } else if(Map[x-1][y-1]=='G') { Map[x-1][y-1]= 'B'; x--,y--; } else break; } else break; } } else { x = xx; y = yy; while(1) { if(in(x+1,y-1)&&!vis[x+1][y-1]) { if(Map[x+1][y-1]=='B') { vis[x+1][y-1] = 1; x++,y--; } else if(Map[x+1][y-1]=='G') { Map[x+1][y-1] ='R'; x++,y--; } else break; } else break; } x = xx; y = yy; while(1) { if(in(x-1,y+1)&&!vis[x-1][y+1]) { if(Map[x-1][y+1]=='B') { vis[x-1][y+1] = 1; x--,y++; } else if(Map[x-1][y+1]=='G') { Map[x-1][y+1] ='R'; x--,y++; } else break; } else break; } } return 0; } int main() { int t; cin>>t; while(t--) { memset(vis,0,sizeof(vis)); scanf("%d",&n); for(int i=0; i<n; i++) scanf("%s",Map[i]); m = strlen(Map[0]); int sum = 0; for(int i=0; i<n; i++) { for(int j=0; j<m; j++) { if(vis[i][j]) continue; if(Map[i][j]=='.') continue; sum++; if(Map[i][j]=='R'||Map[i][j]=='G') { if(Map[i][j]=='R') vis[i][j] = 1; else Map[i][j]='B'; sao(i,j,1); } else if(Map[i][j]=='B'||Map[i][j]=='G') { if(Map[i][j]=='B') vis[i][j] = 1; else Map[i][j]='R'; sao(i,j,0); } } } for(int i=0; i<n; i++) { for(int j=0; j<m; j++) { if(vis[i][j]) continue; if(Map[i][j]=='.') continue; sum++; if(Map[i][j]=='R'||Map[i][j]=='G') { if(Map[i][j]=='R') vis[i][j] = 1; else Map[i][j]='B'; sao(i,j,1); } else if(Map[i][j]=='B'||Map[i][j]=='G') { if(Map[i][j]=='B') vis[i][j] = 1; else Map[i][j]='R'; sao(i,j,0); } } } printf("%d\n",sum); } return 0; }
版权声明:本文为博主原创文章,未经博主允许不得转载。
原文地址:http://blog.csdn.net/u013588639/article/details/47112189