# 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;
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;
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≤100,1≤m≤1000,1≤X≤10,1≤T≤10。