牛客网-E-对弈

链接:https://www.nowcoder.com/acm/contest/136/E
来源:牛客网
 

时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 262144K,其他语言524288K
64bit IO Format: %lld

题目描述

    善弈者谋势,不善弈者谋子。

                                        ——《弈林新编》

    蒟蒻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

说明

在第9步时,HtBest获胜,当前局面:

示例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

说明

 

在第22步时,WHZ获胜,当前局面:

示例3

输入

复制

10 1
1 1

输出

复制

UNK 1

说明

下一手后,胜负未分。

备注:

对于100%的测试数据:
1 ≤ n ≤ 1000
1 ≤ m ≤ 100000

思路:只需要每下一步子,对其4个方位进行探测即可,简单模拟。

代码:

#include<cstdio>

#define N 1010
#define M 8
int chess[2][N][N];

int dct[][2] = {1, 0,
				1, 1,
				0, 1,
				-1, 1,
				-1, 0,
				-1, -1,
				0, -1,
				1, -1};

int main(){
	
	int n, m;
	int step1, step2;
	scanf("%d %d", &n, &m);
	for(int i = 0;i < m;i++){
		scanf("%d %d", &step1, &step2);
		chess[i & 1][step1][step2] = 1;
		
		for(int j = 0;j < M / 2;j++){
			int c = 1;
			int x = dct[j][0];
			int y = dct[j][1];
			while(chess[i & 1][step1 + x][step2 + y] == 1){
				c++;
				x += dct[j][0];
				y += dct[j][1];
			}
			x = dct[j + 4][0];
			y = dct[j + 4][1];
			while(chess[i & 1][step1 + x][step2 + y] == 1){
				c++;
				x += dct[j + 4][0];
				y += dct[j + 4][1];
			}
			if(c >= 5){
				if(i & 1){
					printf("WHZ %d", i + 1);
				}else{
					printf("HtBest %d", i + 1);
				}
				return 0; 
			}
		}
	}
	printf("UNK %d", m);
	return 0;
}

猜你喜欢

转载自blog.csdn.net/a568283992/article/details/81939877