20180818牛客小白月赛6.E

33 篇文章 0 订阅

题目大意

善弈者谋势,不善弈者谋子。
——《弈林新编》

蒟蒻HtBest与神犇WHZ下棋(五子棋),HtBest执黑棋,WHZ执白棋。由于HtBest天资愚笨,不会判断输赢,所以需要你帮他开发一个判断五子棋输赢的程序。
输入描述:
第一行有2个正整数n,m,分别表示棋盘大小(n*n)和对弈步数。接下来m行,每行两个正整数xi,yi ,表示对弈者下棋的坐标,第2、4、6…行是HtBest下的棋子,第3、5、7…行是WHZ下的棋子。
输出描述:

第一行一个字符串s 和一个正整数num ,用空格隔开,分别表示对弈的胜负结果和该结果出现时的步数,如果HtBest胜则s=“HtBest”,num为HtBest胜利时的步数(为偶数),如果WHZ胜则s=“WHZ”,num为WHZ胜利时的步数(为奇数),如果对弈m步后胜负仍未定,则s=“UNK”,num=m。
示例1
输入
10 20
1 1
1 2
2 1
2 2
3 1
3 2
4 1
4 2
5 1
5 2
6 1
6 2
7 1
7 2
8 1
8 2
9 1
9 2
10 1
10 2
输出
HtBest 9

示例2
输入
10 27
8 6
9 4
2 1
7 5
4 7
8 4
4 3
5 4
10 3
5 5
9 7
9 5
3 4
6 3
5 10
1 5
9 2
6 5
5 7
1 4
2 5
8 5
1 3
3 2
8 3
2 6
输出
WHZ 22

示例3
输入
10 1
1 1
输出
UNK 1

分析

一道简单的循环题目,我们在下完棋子后可通过循环进行判断,这样就可以做了
上代码

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值