求大神解 x字棋
  • 板块灌水区
  • 楼主longyunzi
  • 当前回复0
  • 已保存回复0
  • 发布时间2024/9/22 10:14
  • 上次更新2024/9/22 11:48:15
查看原帖
求大神解 x字棋
1385847
longyunzi楼主2024/9/22 10:14
# include <bits/stdc++.h>
using namespace std;   
char a[105][1005];
bool check1(int x,int y,int k,int n,char w){
    
    //竖
	int sum=0;
    int x1=x,y1=y;
    for(int i=1;x1>=1 && x1<=n;i++){
        if(a[i][y]!=w) break;
        x1=x+i;
        sum++;
    }
    x1=x;
    y1=y;
    for(int i=1;x1>=1 && x1<=n;i++){
        if(a[i][y]!=w) break;
        x1=x-i;
        sum++;
    }
	if(sum>=k) return true;
    
    //横
    sum=0;
    x1=x;
    y1=y;
    for(int i=1;y1>=1 && y1<=n;i++){
        if(a[x][y1]!=w) break;
        y1=y+i;
        sum++;
    }
    x1=x;
    y1=y;
    for(int i=1;y1>=1 && y1<=n;i++){
        if(a[x][y1]!=w) break;
        y1=y-i;
        sum++;
    }
    if(sum>=k) return true;
    
    
    //斜1
    sum=0;
    x1=x;
    y1=y;
    for(int i=1;y1>=1 && y1<=n && x1>=1 && x1<=n;i++){
        if(a[x1][y1]!=w) break;
        y1=y+i;
        x1+=x+i;
        sum++;
    }
    x1=x;
    y1=y;
    for(int i=1;y1>=1 && y1<=n && x1>=1 && x1<=n;i++){
        if(a[x1][y1]!=w) break;
        y1=y-i;
        x1=x-i;
        sum++;
    }
    if(sum>=k) return true;
    
    //斜2
     sum=0;
    x1=x;
    y1=y;
    for(int i=1;y1>=1 && y1<=n && x1>=1 && x1<=n;i++){
        if(a[x1][y1]!=w) break;
        y1=y+i;
        x1=x-i;
        sum++;
    }
    x1=x;
    y1=y;
    for(int i=1;y1>=1 && y1<=n && x1>=1 && x1<=n;i++){
        if(a[x1][y1]!=w) break;
        y1=y-i;
        x1=x+i;
        sum++;
    }
    if(sum>=k) return true;
    
    return false;
}
#pragma GCC optimize(3,"Ofast","inline")
int main(){
	int T;
    cin>>T;
    while(T--){
        int n,m,X;
        cin>>n>>m>>X;
        memset(a,'.',sizeof(a));
        for(int i=1;i<=m;i++){
            int x,y;
            cin>>x>>y;
            if(i%2==0) {
                a[x][y]='1';
                if(check1(x,y,X,n,'1')) {
                    cout<<"Alice "<<i;
                }
            }
            else {
                a[x][y]='2';
                if(check1(x,y,X,n,'2')) {
                    cout<<"Bob "<<i;
                }
            }
            
        }
        cout<<"draw";
    }
}

题目描述

Alice和Bob正在X子棋。在一个n∗n的棋盘上,Alice先手,Bob后手。类似五子棋的规则,每个人可以在棋盘上没有棋子的地方放上一个自己的棋子。

如果某刻某个人的棋子组成的横向的或者纵向的或者斜向的X个棋子的话,那个人就获得了胜利。

现在他们想请你判断一下棋局究竟是谁获得了胜利。

输入格式

第一行一个正整数T,表示测试点数目。

对于每一个测试点,第一行三个数n,m,X,表示棋盘大小,当前走的步数,和赢的条件。

接下来m行,第i行两个数x,y,表示第i步走了第x行第y列那个格子。步数是按照时间顺序给的,如果i是奇数,那么第i步是Alice走的,否则就是Bob走的。

输入保证合法,即不会出现在已经有棋子的格子走或者坐标出界的情况。

输出格式

对于每一个测试点,如果最早在第i步已经分出胜负了,那就输出一个字符串和一个数,即胜者名字和i。

如果m步之后还没有决出胜负,则输出"draw"(不含引号)。

样例输入 1 

2
3 9 3
2 2
2 3
1 3
3 1
1 1
1 2
3 3
3 2
2 1
3 3 2
1 1
2 2
3 3
样例输出 1 

Alice 7
draw
提示/说明

对于 50%的数据,满足 n≤15,m≤40,X≤5。

对于 100% 的数据,满足 1≤n≤1001≤m≤1000,1≤X≤10,1≤T≤10
2024/9/22 10:14
加载中...