题意:
给你一种转换方法,你要把转换的结果还原成一个n*n的矩阵
然后识别这个n*n的矩阵里面的图案是上述哪一个图案,输出那个人的名字。
矩阵只有0(黑色),1(白色)组成
解析:
这个跟之前百度之星的识别0,1的做法一样,还百度之星那个难一点。因为这道题保证图案不会碰到边界
那么就找白的联通块个数和黑的连通块个数。但是样例给的那两个图案,黑白连通块的个数是一样的....
那么只能通过黑点/所有点的比例来判断了(这也是为什么样例要选择这两个图案...)
#include <iostream>
#include<time.h>
#include<stdlib.h>
#include<cstdio>
#include<cstring>
#include <bitset>
#include <fstream>
#include <queue>
#include <algorithm>
using namespace std;
const int N = 1E3+10;
int mp[N][N];
int vis[N][N];
int n;
typedef pair<int,int> PII;
int dir[8][2]={-1,-1,-1,0,-1,1,0,-1,0,1,1,-1,1,0,1,1};
PII find_(int x)
{
PII s;
s.first=s.second=-1;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
if(!vis[i][j]&&mp[i][j]==x)
{
s.first=i;
s.second=j;
return s;
}
}
}
return s;
}
queue<PII> mq;
int bfs(PII s,int flag)
{
while (!mq.empty())mq.pop();
mq.push(s);
vis[s.first][s.second]=1;
while (!mq.empty())
{
PII u=mq.front();
mq.pop();
for(int i=0;i<8;i++)
{
PII now;
now.first=u.first+dir[i][0];
now.second=u.second+dir[i][1];
if(now.first>=1&&now.first<=n&&now.second>=1&&now.second<=n&&!vis[now.first][now.second])
{
if(mp[now.first][now.second]==flag){
vis[now.first][now.second]=1;
mq.push(now);
}
}
}
}
return 1;
}
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
memset(vis,0,sizeof(vis));
int m;
scanf("%d%d",&n,&m);
int row=0;
int flag=1;
//ofstream ofs;
//ofs.open("G:\\pic.txt");
int sh=N;
int xh=0;
int lw=N;
int rw=0;
int k=1;
int zero=0;
for(int i=1;i<=m;i++)
{
int tmp;
scanf("%d",&tmp);
for(int j=1;j<=tmp;j++)
{
//ofs<<flag;
mp[k][row+1]=flag;
if(!flag)sh=min(sh,k),xh=max(xh,k),zero++;
if(!flag)lw=min(lw,row+1),rw=max(rw,row+1);
row++;
if(row%n==0) /*ofs<<endl,*/k++,row=0;
}
flag^=1;
}
/*cout<<"black:"<<zero<<endl;
cout<<sh<<","<<xh<<endl<<lw<<","<<rw<<endl;
cout<<xh-sh<<","<<rw-lw<<endl;
cout<<(double) (xh-sh)/(rw-lw)<<endl;*/
//0
PII s;
int k0,k1;
k0=k1=0;
while ((s=find_(0)).first!=-1)
{
k0+=bfs(s,0);
}
while ((s=find_(1)).first!=-1)
{
k1+=bfs(s,1);
}
if(k0==9)
{
printf("Baekhyun\n");
}
else if(k0==3)
{
printf("Kris\n");
}
else if(k0==6)
{
printf("Lay\n");
}
else if(k0==1)
{
if(k1==2) printf("D.O\n");
else printf("Chen\n");
}
else if(k0==2)
{
if(k1>=10) printf("Kai\n");
else if(k1==4) printf("Tao\n");
else printf("Suho\n");
}
else if(k0==5)
{
if(k1==8) printf("Luhan\n");
else if(k1==1) printf("Chanyeol\n");
else if(zero*1.0/(n*n)>0.18) printf("Sehun\n");
else printf("Xiumin\n");
}
}
}