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