暴力模拟过程即可,建议判断是否形成5个时走dfs计数,当发现斜角或直线有5个后直接结束输入

代码

int al[1001][1001],n,m;
bool check(int x,int y,int z){
    int a=0,b=0,c=0,d=0,e=0,f=0,g=0,h=0;
    for(int i=1;x+i<=n;i++){
        if(al[x+i][y]==z)
            a++;
        else
            break;
    }
    for(int i=1;x-i>0;i++){
        if(al[x-i][y]==z)
            b++;
        else
            break;
    }
    if(a+b+1>=5)
        return 1;
    for(int i=1;y+i<=n;i++){
        if(al[x][y+i]==z)
            c++;
        else
            break;
    }
    for(int i=1;y-i>0;i++){
        if(al[x][y-i]==z)
            d++;
        else
            break;
    }
    if(c+d+1>=5)
        return 1;
    for(int i=1;(x+i<=n)&&(y+i<=n);i++){
        if(al[x+i][y+i]==z)
            e++;
        else
            break;
    }
    for(int i=1;(x-i>0)&&(y-i>0);i++){
        if(al[x-i][y-i]==z)
            f++;
        else
            break;
    }
    if(e+f+1>=5)
        return 1;
    for(int i=1;(x+i<=n)&&(y-i>0);i++){
        if(al[x+i][y-i]==z)
            g++;
        else
            break;
    }
    for(int i=1;(x-i>0)||(y+i<=n);i++){
        if(al[x-i][y+i]==z)
            h++;
        else
            break;
    }
    if(h+g+1>=5)
        return 1;
    return 0;
}
int main(){
    memset(al,0,sizeof(al));
    scanf("%d%d",&n,&m);
    for(int i=1,x,y;i<=m;i++){
        scanf("%d%d",&x,&y);
        al[x][y]=i%2+1;
        if(check(x,y,i%2+1)){
            if(i%2){
                printf("HtBest %d\n",i);
                return 0;
            }
            else{
                printf("WHZ %d\n",i);
                return 0;
            }
        }
    }
    printf("UNK %d\n",m);
    return 0;
}