列表

详情


NC17364. 对弈

描述

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

                                        ——《弈林新编》

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

说明:

下一手后,胜负未分。

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++11(clang++ 3.9) 解法, 执行用时: 67ms, 内存消耗: 1228K, 提交时间: 2020-02-28 13:18:09

#include<bits/stdc++.h>
using namespace std;
const int p[4][2]={{1,0},{0,1},{1,1},{-1,1}};
int n,m;
char now[1005][1005];
bool check(int x,int y)
{
	for(int i=0;i<4;i++)
	{
		int cnt=-1;
		for(int r=x,c=y;r&&c&&r<=n&&c<=n;r-=p[i][0],c-=p[i][1])
		if(now[r][c]==now[x][y]) cnt++;
		else break;
		for(int r=x,c=y;r&&c&&r<=n&&c<=n;r+=p[i][0],c+=p[i][1])
		if(now[r][c]==now[x][y]) cnt++;
		else break;
		if(cnt>=5) return 1;
	}
	return 0;
}
int main()
{
	cin>>n>>m;
	for(int i=1;i<=m;i++)
	{
		int x,y;
		cin>>x>>y;
		now[x][y]=i&1?'H':'W';
		if(check(x,y))
		{
			printf("%s %d\n",i&1?"HtBest":"WHZ",i);
			return 0;
		}
	}
	printf("UNK %d\n",m);
	return 0;
}

上一题