首先很容易得出,最多3种颜色,就能将任意六边形图进行染色。
1种颜色和2种颜色情况很容易求解。对于3种颜色,需要满足一下之一的条件:
1.存在3个六边形共顶点。
2.存在奇数环。
奇数环可以直接用dfs求解。
#include <bits/stdc++.h>
using namespace std;
int go[6][2]={{0,1},{0,-1},{1,0},{-1,0},{1,-1},{-1,1}};
char mz[55][55];
int flag,n,vis[55][55];
void dfs(int x,int y,int deep)
{
vis[x][y]=deep;
int i,tmpx,tmpy;
for(i=0;i<6;i++)
{
tmpx=x+go[i][0];
tmpy=y+go[i][1];
if(tmpx>=0&&tmpx<n&&tmpy>=0&&tmpy<n&&mz[tmpx][tmpy]=='X')
{
if(!vis[tmpx][tmpy])
dfs(tmpx,tmpy,deep+1);
else if((abs(vis[x][y]-vis[tmpx][tmpy])&1)==0)
flag=1;
}
}
}
int main()
{
int T,i,j,ans;
scanf("%d",&T);
while(T--)
{
scanf("%d",&n);
for(i=0;i<n;i++)
for(j=0;j<n;j++)
scanf(" %c",&mz[i][j]);
ans=0;
for(i=0;i<n;i++)
for(j=0;j<n;j++)
if(mz[i][j]=='X')
ans=1;
for(i=1;i<n;i++)
for(j=0;j<n;j++)
if(mz[i][j]=='X'&&mz[i-1][j]=='X')
ans=2;
for(i=1;i<n;i++)
for(j=0;j<n-1;j++)
if(mz[i][j]=='X'&&mz[i-1][j+1]=='X')
ans=2;
for(i=0;i<n;i++)
for(j=0;j<n-1;j++)
if(mz[i][j]=='X'&&mz[i][j+1]=='X')
ans=2;
for(i=0;i<n-1;i++)
for(j=0;j<n-1;j++)
if(mz[i][j]=='X'&&mz[i+1][j]=='X'&&mz[i][j+1]=='X')
ans=3;
for(i=0;i<n-1;i++)
for(j=1;j<n;j++)
if(mz[i][j]=='X'&&mz[i+1][j-1]=='X'&&mz[i+1][j]=='X')
ans=3;
if(ans==2)
{
memset(vis,0,sizeof(vis));
flag=0;
for(i=0;i<n;i++)
for(j=0;j<n;j++)
if(mz[i][j]=='X'&&!vis[i][j])
dfs(i,j,1);
ans+=flag;
}
printf("%d\n",ans);
}
}