思路:使用dfs搜索时,存在一个规律:满足条件的两个格子其横纵坐标之和的奇偶性必相反,这样,只需遍历此连通块中所有格子的横纵坐标和,判断其奇偶性,求ans=min(ans1,ans2)即可,ans1为奇数个数,ans2为偶数个数
#include<iostream>
#include<cstdio>
using namespace std;
const int maxn=50+5;
const int dx[]={-1,1,0,0};
const int dy[]={0,0,-1,1};
char str[maxn][maxn];
int n,ans1,ans2;
void dfs(int x,int y)
{
str[x][y]='.';
(x+y)&1?ans1++:ans2++;
for(int i=0;i<4;i++)
{
int nx=x+dx[i],ny=y+dy[i];
if(nx>=0&&nx<n&&ny>=0&&ny<n&&str[nx][ny]=='#') {
dfs(nx,ny);
}
}
}
int main()
{
int T,kase=0;
scanf("%d",&T);
while(T--)
{
scanf("%d",&n);
for(int i=0;i<n;i++)
scanf("%s",&str[i]);
int sum=0;
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
if(str[i][j]=='#') {
ans1=ans2=0;
dfs(i,j);
sum+=min(ans1,ans2);
}
printf("Case %d: %d\n",++kase,sum);
}
return 0;
}