善弈者谋势,不善弈者谋子。
——《弈林新编》
蒟蒻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
示例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
示例3
输入
10 1
1 1
输出
UNK 1
一道简单的循环题目,我们在下完棋子后可通过循环进行判断,这样就可以做了
上代码
#include
#include
#include
#include
#include
int al[1001][1001],n,m;
bool check(int x,int y,int z){
int a=0,b=0,c=0,d=0,e=0,f=0,g=0,h=0;
for(int i=1;x+i<=n;i++){
if(al[x+i][y]==z)
a++;
else
break;
}
for(int i=1;x-i>0;i++){
if(al[x-i][y]==z)
b++;
else
break;
}
if(a+b+1>=5)
return 1;
for(int i=1;y+i<=n;i++){
if(al[x][y+i]==z)
c++;
else
break;
}
for(int i=1;y-i>0;i++){
if(al[x][y-i]==z)
d++;
else
break;
}
if(c+d+1>=5)
return 1;
for(int i=1;(x+i<=n)&&(y+i<=n);i++){
if(al[x+i][y+i]==z)
e++;
else
break;
}
for(int i=1;(x-i>0)&&(y-i>0);i++){
if(al[x-i][y-i]==z)
f++;
else
break;
}
if(e+f+1>=5)
return 1;
for(int i=1;(x+i<=n)&&(y-i>0);i++){
if(al[x+i][y-i]==z)
g++;
else
break;
}
for(int i=1;(x-i>0)||(y+i<=n);i++){
if(al[x-i][y+i]==z)
h++;
else
break;
}
if(h+g+1>=5)
return 1;
return 0;
}
int main(){
memset(al,0,sizeof(al));
scanf("%d%d",&n,&m);
for(int i=1,x,y;i<=m;i++){
scanf("%d%d",&x,&y);
al[x][y]=i%2+1;
if(check(x,y,i%2+1)){
if(i%2){
printf("HtBest %d\n",i);
return 0;
}
else{
printf("WHZ %d\n",i);
return 0;
}
}
}
printf("UNK %d\n",m);
return 0;
}