乍一看什么鬼!
实际上 数0 1 的联通块的个数即可。
最后一个与最后第四个是相同的
需要判断下黑白的比例(根据给出的案例1,2)
用了DFS爆栈了。。
#include <bits/stdc++.h>
using namespace std;
typedef pair<int, int> PII;
#define ll long long
const ll mod = 1e9 + 7;
const int maxn= 1111;
int mp[maxn][maxn];
int dd[8][2]={
0,1,
0,-1,
1,0,
-1,0,
1,1,
1,-1,
-1,1,
-1,-1
},n;
string s[12]={"Baekhyun","Chanyeol","Chen","D.O","Kai",
"Kris","Lay","Luhan","Sehun","Suho","Tao","Xiumin"};
int a[12][2]={9,2,5,1,1,3,1,2,2,13,3,1,6,2,5,8,5,2,2,8,2,4,5,2};
//int dfs(int x,int y,int p)
//{
// mp[x][y]=-1;
// for(int i=0;i<8;++i)
// {
// int dx=x+dd[i][0];
// int dy=y+dd[i][1];
// if(dx<0||dy<0||dy>=n||dx>=n) continue;
// if(mp[dx][dy]!=p) continue;
// dfs(dx,dy,p);
// }
//}
void bfs(int x, int y, int c)
{
queue<PII> Q;
Q.push(PII(x, y));
mp[x][y] = -1;
while (!Q.empty())
{
PII nw = Q.front(); Q.pop();
for (int i = 0; i < 8; ++ i)
{
x = nw.first + dd[i][0], y = nw.second + dd[i][1];
if (x < 0 || y < 0 || x >= n || y >= n) continue;
if (mp[x][y] != c) continue;
mp[x][y] = -1;
Q.push(PII(x, y));
}
}
}
int main()
{
int m,t;
cin>>t;
while(t--)
{
cin>>n>>m;
int x,cb=0,l=0,r=0;
for(int i=0;i<m;i++)
{
cin>>x;
if(1&i) cb+=x;
while(x--)
{
mp[l][r]=i&1;
r++;
if(r==n)
l++,r=0;
}
}
int ans[2]={0,0};
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
if(mp[i][j]!=-1)
ans[mp[i][j]]++,bfs(i,j,mp[i][j]);
if(ans[1]==5&&ans[0]==2)
{
if(cb*10000<1800*n*n)
printf("Xiumin\n");
else printf("Sehun\n");
continue;
}
for(int i=0;i<12;i++)
if(ans[1]==a[i][0]&&ans[0]==a[i][1])
{
cout<<s[i]<<endl;
break;
}
}
return 0;
}