ZOJ3864:Quiz for EXO-L(BFS)

Exo (Korean: 엑소; Chinese:爱咳嗽; often stylized as EXO) is a Chinese-South Korean boy band based in Seoul, South Korea. Formed by SM Entertainment in 2011, the group consists of twelve members separated into two subgroups, EXO-K and EXO-M, performing music in Korean and Mandarin, respectively. The group officially debuted on April 8, 2012, with Suho, Baekhyun, Chanyeol, D.O, Kai, and Sehun under the Korean subgroup while Xiumin, Luhan, Kris, Lay, Chen, and Tao are under the Mandarin group. Kris filed a lawsuit against S.M. to be removed from the group, and Luhan followed suit in October 2014. The band now promotes with 10 members since mid-October 2014, which consists of 8 Korean and 2 Chinese members.

In their first album, each member of EXO has a kind of super power. For example, Tao can control time and Lay has a super power of healing. The badges are the symbols of their super powers. Each member of EXO has an unique badge. The following table shows the shapes of their badges.

Baekhyun - lightChanyeol - flameChen - lightningD.O - earth
BaekhyunChanyeolChenD.O
Kai - teleportationKris - flightLay - healingLuhan - telekinesis
KaiKrisLayLuhan
Sehun - windSuho - waterTao - time controlXiumin - frost
SehunSuhoTaoXiumin

EXO’s official fanclub name has been announced to be EXO-L. EXO-L is short for EXO-LOVE, L being the letter between M and K in the alphabet, signifying all the fans' love for both EXO-K and EXO-M of EXO, and also holds the meaning of 'EXO and the fans are one' like their team slogan 'WE ARE ONE.'

You should help an EXO-L pass a quiz about image recognition. The quiz requires a program to recognize the badges. The input is one of the above 12 images with rotation, and the output should be the owner of the badge in the image. The badge is rotated at an unknown angle. And each image is a square matrix. The badges will never touch or exceed the boundary of the image.

Since the images are large, we will compress the images. Each pixel in the image is either 1(white) or 0(black) after binarization. The compress method is simple:

  • Concatenate the pixels in the row first order to a string.
  • Split the string to some runs with same characters, and two adjacent runs have different characters.
  • Output the length of each run.

For example, an image in size 6×6:

111111
100101
100011
110111
101001
111111
We can compress it as the following:
  • Concatenate the pixels in the row first order, then we can get
    111111100101100011110111101001111111
    
  • The runs are
    1111111 00 1 0 11 000 1111 0 1111 0 1 00 1111111
    
  • So the result of compressed images is
    7 2 1 1 2 3 4 1 4 1 1 2 7
    
Note that in this task the first run and the last run is always in white.

Input

There are multiple test cases. The first line of input contains an integer T indicating the number of test cases. For each test case:

The first line contains 2 integers n and mn is the size of the square image. m is the number of the runs in the compressed images. (100≤ n ≤ 900)

The second line contains m positive integers, indicating the length of the each runs in the compressed image. (The sum of the integers is n2).

Output

For each case, output the owner of the badge in one line. Your output should be formated as one of following words: "Suho", "Baekhyun", "Chanyeol", "D.O", "Kai", "Sehun", "Xiumin", "Luhan", "Kris", "Lay", "Chen", and "Tao".

Sample Input

2
100 443
1445 1 99 2 97 3 97 4 6 1 88 5 5 2 88 5 4 4 86 6 4 4 73 1 12 6 3 6 72 4 8 6 5 5 72 6 6 6 5 6 72 7 3 6 6 6 12 1 59 16 7 6 9 3 60 14 8 6 6 6 61 13 9 6 3 7 65 12 7 16 8 1 45 3 10 12 5 15 6 4 45 5 9 14 3 12 6 6 45 6 8 15 2 9 9 5 47 5 7 17 1 7 10 6 47 6 6 17 2 3 13 5 48 6 5 18 17 6 49 5 5 8 1 10 5 3 8 5 50 6 3 8 5 7 3 7 6 5 50 6 3 8 7 18 2 5 52 5 3 7 10 23 52 6 2 7 13 20 52 6 3 6 15 17 53 7 2 5 19 15 49 10 2 5 21 16 44 12 2 4 24 17 38 12 6 3 25 18 34 12 6 4 26 7 1 13 31 9 7 6 25 7 5 10 34 4 6 9 25 7 8 5 46 8 25 8 58 9 25 7 59 8 25 8 59 8 25 7 48 4 7 8 26 7 8 2 35 9 5 8 25 6 7 7 33 11 3 8 25 4 6 11 35 18 25 3 5 15 36 16 25 3 3 15 40 17 21 4 2 14 44 17 19 5 2 10 49 17 16 6 2 8 51 20 13 6 2 6 52 23 11 7 2 4 53 5 2 18 8 8 2 5 51 6 5 8 2 7 6 7 3 5 51 5 8 4 5 9 2 8 4 4 50 6 17 18 5 5 49 5 13 3 2 18 5 5 48 6 11 5 3 16 7 5 47 6 9 8 2 16 7 5 47 5 7 11 3 14 9 4 46 3 8 14 4 13 9 4 45 1 8 16 6 14 8 2 54 16 9 13 62 9 3 5 8 15 60 6 6 5 8 16 58 5 9 5 7 5 2 9 58 2 12 5 6 6 5 7 72 5 5 5 8 5 72 5 4 6 11 2 73 3 5 5 87 3 5 5 87 3 5 4 89 1 6 4 97 3 97 2 98 2 1445
100 451
1449 2 96 4 96 5 94 6 93 6 94 5 93 6 93 6 10 4 78 7 7 13 72 6 6 18 80 21 62 2 14 24 58 3 14 26 55 3 13 15 6 8 54 4 10 20 8 5 51 5 8 25 8 3 51 4 7 29 7 3 49 5 6 31 7 2 48 5 6 15 4 14 7 1 48 5 5 15 9 11 54 6 4 15 12 10 53 5 4 16 14 8 53 5 3 16 16 8 51 6 3 8 1 6 18 8 50 6 2 8 2 6 19 7 50 6 2 7 3 5 7 21 5 1 43 6 1 7 4 5 4 24 4 2 43 6 1 7 4 5 2 26 4 3 43 12 4 5 2 28 3 3 43 12 4 5 16 14 3 4 42 11 5 5 19 12 3 4 42 10 5 5 15 1 5 10 3 5 41 10 6 3 16 1 7 8 4 5 40 9 7 3 16 2 7 8 3 7 32 1 6 8 7 3 16 2 8 7 4 7 29 5 4 8 7 3 16 3 7 8 4 6 29 6 4 7 7 3 16 3 8 7 5 5 29 7 3 8 7 2 16 3 8 8 5 3 31 6 4 8 6 2 16 4 7 8 40 6 4 8 6 1 16 4 6 10 40 6 3 9 6 1 15 4 6 10 42 4 3 11 20 4 6 10 42 4 4 12 18 4 6 11 42 3 4 15 15 4 5 12 43 2 4 26 3 5 5 12 43 2 4 25 4 5 4 6 1 6 44 1 5 6 2 14 6 5 4 6 1 6 44 1 5 7 5 6 9 6 3 7 1 6 50 8 19 6 2 7 2 6 51 8 18 6 1 7 3 6 51 9 16 15 3 6 52 10 13 15 4 5 54 11 11 14 5 5 47 1 6 14 6 15 6 4 49 1 6 33 6 5 49 2 6 31 7 4 50 3 7 27 8 4 52 4 6 25 9 3 53 6 7 20 10 3 55 29 12 2 57 26 14 1 60 23 78 20 6 5 71 15 7 8 72 10 8 7 92 7 92 6 93 6 94 6 94 5 95 4 97 2 1448

Sample Output
Xiumin
Sehun
Hint

The images in the sample input are visualized as:

Sample 1Sample 2
Sample 1
Sample 2
    



其实这道题并不难,但是就是题意箱单难理解,我一看到这道题的第一感觉就是跟HDU3839那个题有点像,后来一试确实如此,就是看化成二进制后的白色块数量与褐色块数量与上面图形中哪个妇婴而已,要注意,对于最外层的白色块是不计算在内的,我们要计算的是被黑色快包围的白色块的数量


#include <iostream>
#include <stdio.h>
#include <string.h>
#include <stack>
#include <queue>
#include <map>
#include <set>
#include <vector>
#include <math.h>
#include <algorithm>
using namespace std;
#define ls 2*i
#define rs 2*i+1
#define up(i,x,y) for(i=x;i<=y;i++)
#define down(i,x,y) for(i=x;i>=y;i--)
#define mem(a,x) memset(a,x,sizeof(a))
#define w(a) while(a)
#define LL long long
const double pi = acos(-1.0);
#define Len 1000005
#define mod 998244353

struct Point
{
    int x,y;
};

int t,n,m,lx,ly,x,y;
int vis[1005][1005],mat[1005][1005];
int to[8][2] = {1,0,0,1,-1,0,0,-1,1,1,1,-1,-1,1,-1,-1};

int bfs(int x,int y,int k)
{
    int i,j;
    queue<Point> Q;
    Point a,next;
    a.x = x;
    a.y = y;
    vis[x][y] = 1;
    int cnt = 1;
    Q.push(a);
    w(!Q.empty())
    {
        a = Q.front();
        Q.pop();
        up(i,0,7)
        {
            next.x = a.x+to[i][0];
            next.y = a.y+to[i][1];
            if(next.x>=0 && next.x<n && next.y>=0 && next.y<n)
            {
                if(vis[next.x][next.y]) continue;
                if(mat[next.x][next.y]!=k) continue;
                vis[next.x][next.y] = 1;
                cnt++;
                Q.push(next);
            }
        }
    }
    return cnt;
}

int main()
{
    int i,j,k;
    scanf("%d",&t);
    w(t--)
    {
        scanf("%d%d",&n,&m);
        lx = ly = 0;
        up(i,0,m-1)
        {
            scanf("%d",&x);
            w(x--)
            {
                mat[lx][ly] = i%2;
                vis[lx][ly] = 0;
                ly++;
                if(ly == n)
                {
                    lx++;
                    ly = 0;
                }
            }
        }
        bfs(0,0,0);
        vector<int> black,white;
        up(i,0,n-1)
        {
            up(j,0,n-1)
            {
                if(!vis[i][j])
                {
                    if(!mat[i][j])
                        white.push_back(bfs(i,j,0));
                    else
                        black.push_back(bfs(i,j,1));
                }
            }
        }
        int bcnt = black.size(),wcnt = white.size();
        if(bcnt==1)
        {
            if(wcnt==1)
                puts("D.O");
            else if(wcnt==2)
                puts("Chen");
        }
        else if(bcnt==2)
        {
            if(wcnt==12)
                puts("Kai");
            else if(wcnt==7)
                puts("Suho");
            else if(wcnt==3)
                puts("Tao");
        }
        else if(bcnt==3)
        {
            if(wcnt==0)
                puts("Kris");
        }
        else if(bcnt==5)
        {
            if(wcnt==0)
                puts("Chanyeol");
            else if(wcnt==7)
                puts("Luhan");
            else if(wcnt==1)
            {
                sort(black.begin(),black.end());
                int sum=black[0]+black[1]+black[2]+black[3];
                double tem=(double)sum/black[4];
                if(tem<0.4)
                    puts("Sehun");
                else puts("Xiumin");
            }
        }
        else if(bcnt==6)
        {
            if(wcnt==1)
                puts("Lay");
        }
        else if(bcnt==9)
        {
            if(wcnt==1)
                puts("Baekhyun");
        }

    }

    return 0;
}







评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值