求助!qwq

ykj43 2023-12-23 20:18:14 2

题目:五子棋

五子棋是世界智力运动会竞技项目之一,是一种两人对弈的纯策略型棋类游戏,是世界智力 运动会竞技项目之一,每人一次下一子,黑棋先下(为先手),白棋后下,黑白双方轮流交 替下子,不得在已经有棋子的地方落子。 获胜的判定:只要黑白方中任意一方的棋子有五子连在一起(即五子连珠),可以为横连、 纵连、斜连,则该方获胜,游戏结束。

PYB 和 YYX 喜欢互相切磋五子棋,这一天,趁着 HD 在讲台上生机勃勃地讲着分块,PYB 和 YYX 在后排正大光明地玩着五子棋,YYX 慷慨地让 PYB 执黑棋(先下子),请屏幕前的你判 断谁赢。

输入

第一行,一个整数 n,表示棋盘的大小为 n*n。 第二行,一个整数 m,表示 PYB 和 YYX 下了 m 个棋子.. 接下来 m 行, 每行两个正整数 i,j,依次表示每个棋子落子在第 i 行第 j 列

输出

如果 YYX 赢了,输出“YYX wins!” 如果 PYB 赢了,输出“PYB wins!” 如果棋子下完后,仍没有任何一方赢,输出“Draw!” 如果出现了不合法的落子,输出“Wrong!” 任意一方赢后,忽略之后的棋子.

样例

样例输入

5

10

3 1

1 1

3 2

2 2

3 3

4 4

3 4

5 5

3 5

6 6

样例输出

PYB wins!

提示

1<=n<=100,1<=m<=2000

{{ vote && vote.total.up }}

共 2 条回复

ykj43

我的答辩代码居然得了60分→←

#include<bits/stdc++.h>
using namespace std;

int n,m;//n*n   m个棋子 
int a[200][200];
int x,y;

int win_pyb(int n,int m){
	if(a[n+1][m]==1 && a[n+2][m]==1 && a[n+3][m]==1 && a[n+4][m]==1) return 1;
	if(a[n-1][m]==1 && a[n+1][m]==1 && a[n+2][m]==1 && a[n+3][m]==1) return 1;
	if(a[n-2][m]==1 && a[n-1][m]==1 && a[n+1][m]==1 && a[n+2][m]==1) return 1;
	if(a[n-3][m]==1 && a[n-2][m]==1 && a[n-1][m]==1 && a[n+1][m]==1) return 1;
	if(a[n-4][m]==1 && a[n-3][m]==1 && a[n-2][m]==1 && a[n-1][m]==1) return 1;
	
	if(a[n][m+1]==1 && a[n][m+2]==1 && a[n][m+3]==1 && a[n][m+4]==1) return 1;
	if(a[n][m-1]==1 && a[n][m+1]==1 && a[n][m+2]==1 && a[n][m+3]==1) return 1;
	if(a[n][m-2]==1 && a[n][m-1]==1 && a[n][m+1]==1 && a[n][m+2]==1) return 1;
	if(a[n][m-3]==1 && a[n][m-2]==1 && a[n][m-1]==1 && a[n][m+1]==1) return 1;
	if(a[n][m-4]==1 && a[n][m-3]==1 && a[n][m-2]==1 && a[n][m-1]==1) return 1;
	
	if(a[n+1][m+1]==1 && a[n+2][m+2]==1 && a[n+3][m+3]==1 && a[n+4][m+4]==1) return 1;
	if(a[n-1][m-1]==1 && a[n+1][m+1]==1 && a[n+2][m+2]==1 && a[n+3][m+3]==1) return 1;
	if(a[n-2][m-2]==1 && a[n-1][m-1]==1 && a[n+1][m+1]==1 && a[n+2][m+2]==1) return 1;
	if(a[n-3][m-3]==1 && a[n-2][m-2]==1 && a[n-1][m-1]==1 && a[n+1][m+1]==1) return 1;
	if(a[n-4][m-4]==1 && a[n-3][m-3]==1 && a[n-2][m-2]==1 && a[n-1][m-1]==1) return 1;
	
	if(a[n+1][m-1]==1 && a[n+2][m-2]==1 && a[n+3][m-3]==1 && a[n+4][m-4]==1) return 1;
	if(a[n-1][m+1]==1 && a[n+1][m-1]==1 && a[n+2][m-2]==1 && a[n+3][m-3]==1) return 1;
	if(a[n-1][m+1]==1 && a[n-2][m+2]==1 && a[n+1][m-1]==1 && a[n+2][m-2]==1) return 1;
	if(a[n-1][m+1]==1 && a[n-2][m+2]==1 && a[n-3][m+3]==1 && a[n+1][m-1]==1) return 1;
	if(a[n-1][m+1]==1 && a[n-2][m+2]==1 && a[n-3][m+3]==1 && a[n-4][m+4]==1) return 1;
	return 0;
}
int win_yyx(int n,int m){
	if(a[n+1][m]==2 && a[n+2][m]==2 && a[n+3][m]==2 && a[n+4][m]==2) return 1;
	if(a[n-1][m]==2 && a[n+1][m]==2 && a[n+2][m]==2 && a[n+3][m]==2) return 1;
	if(a[n-2][m]==2 && a[n-1][m]==2 && a[n+1][m]==2 && a[n+2][m]==2) return 1;
	if(a[n-3][m]==2 && a[n-2][m]==2 && a[n-1][m]==2 && a[n+1][m]==2) return 1;
	if(a[n-4][m]==2 && a[n-3][m]==2 && a[n-2][m]==2 && a[n-1][m]==2) return 1;
	
	if(a[n][m+1]==2 && a[n][m+2]==2 && a[n][m+3]==2 && a[n][m+4]==2) return 1;
	if(a[n][m-1]==2 && a[n][m+1]==2 && a[n][m+2]==2 && a[n][m+3]==2) return 1;
	if(a[n][m-2]==2 && a[n][m-1]==2 && a[n][m+1]==2 && a[n][m+2]==2) return 1;
	if(a[n][m-3]==2 && a[n][m-2]==2 && a[n][m-1]==2 && a[n][m+1]==2) return 1;
	if(a[n][m-4]==2 && a[n][m-3]==2 && a[n][m-2]==2 && a[n][m-1]==2) return 1;
	
	if(a[n+1][m+1]==2 && a[n+2][m+2]==2 && a[n+3][m+3]==2 && a[n+4][m+4]==2) return 1;
	if(a[n-1][m-1]==2 && a[n+1][m+1]==2 && a[n+2][m+2]==2 && a[n+3][m+3]==2) return 1;
	if(a[n-2][m-2]==2 && a[n-1][m-1]==2 && a[n+1][m+1]==2 && a[n+2][m+2]==2) return 1;
	if(a[n-3][m-3]==2 && a[n-2][m-2]==2 && a[n-1][m-1]==2 && a[n+1][m+1]==2) return 1;
	if(a[n-4][m-4]==2 && a[n-3][m-3]==2 && a[n-2][m-2]==2 && a[n-1][m-1]==2) return 1;
	
	if(a[n+1][m-1]==2 && a[n+2][m-2]==2 && a[n+3][m-3]==2 && a[n+4][m-4]==2) return 1;
	if(a[n-1][m+1]==2 && a[n+1][m-1]==2 && a[n+2][m-2]==2 && a[n+3][m-3]==2) return 1;
	if(a[n-1][m+1]==2 && a[n-2][m+2]==2 && a[n+1][m-1]==2 && a[n+2][m-2]==2) return 1;
	if(a[n-1][m+1]==2 && a[n-2][m+2]==2 && a[n-3][m+3]==2 && a[n+1][m-1]==2) return 1;
	if(a[n-1][m+1]==2 && a[n-2][m+2]==2 && a[n-3][m+3]==2 && a[n-4][m+4]==2) return 1;
	return 0;
}

int main(){
	int k=1;//奇数该pyb下,偶数该yyx下 
	cin>>n>>m;
	for(int i=1;i<=m;i++){ 
	
		cin>>x>>y;
		if(x>n || y>n || a[x][y]!=0){//判断合法 
			cout<<"Wrong!";
			return 0;
		}
		if(k%2==1){//判断该pyb下 
			if(win_pyb(x,y)){//判断PYB胜利
				cout<<"PYB wins!";
				return 0;
			} 
		}
		if(k%2==0){//判断该yyx下
			if(win_yyx(x,y)){//判断yyx胜利
				cout<<"YYX wins!";
				return 0;
			}
		}
		
		if(k%2==1) a[x][y]=1;//pyb下的为1(黑奇数) 
		else if(k%2==0) a[x][y]=2;//yyx下的为2(白偶数) 
		k++; 
	}
	
	
	return 0;
}
root 站长

dfs 暴力搜索应该可以过