题目描述
假设五子棋的棋盘是
N * N
的(正整数N<20
),黑子用*
表示,白子用#
表示,空位置用.
表示。
现给你一个棋局,请判断黑子是否获胜,如获胜,显示Win,并给出获胜排列的最左边那列的最上方那颗棋子的坐标。(棋盘左上角坐标是(0, 0)
,右下角坐标是(N-1, N-1)
)
如果未获胜,则显示“Not yet”。
注意:
- 不考虑白子是否获胜以及棋子个数与黑子是否匹配,只考虑黑子排列。
- 为简化计算,不用考虑“活四”、“四三连”、“长连”、“三三连”等获胜或禁手条件,只判断黑子有5个(或更多)排成一条直线,包括横线、竖线或斜线为胜利条件。
- 输入保证最多只出现一处黑子胜利的排列,不需要考虑有多处排列时如何判断最左位置。
输入
第一行是正整数
N(N<20)
,接下来是表示棋盘排列的N
行字符,每行有N
个*
或#
或.
字符。
输出
若黑子
(用*表示)
获胜,打印一行字符,依次是Win X Y
,其中X
Y
是黑子获胜排列的最左边那列的最上方的一颗棋子的坐标,X(列号下标)
表示横坐标,Y(行号下标)
表示纵坐标。
若黑子未获胜,打印一行:Not yet
。
样例输入
6 .***.. ..#... ..#... ...... ....*. .....*
样例输出
Not yet
答案代码
#include <stdio.h>
char pan[21][21];
int main() {
int N;
int i,j;
scanf("%d",&N);
getchar();
//因为之前的N,此时缓存区有一个回车符,必须先清空,不然影响后面字符的读取。
for(i=0;i<N;i++)
{
for(j=0;j<N;j++)
pan[i][j]=getchar();
getchar(); //一行结束,将最后输入的回车符读掉;
}
for(i=0;i<N;i++)
{
for(j=0;j<N;j++)
{
if(pan[i][j]=='*')
{
//打横判断
if(j+4<N&&pan[i][j+1]=='*'&&pan[i][j+2]=='*'
&&pan[i][j+3]=='*'&&pan[i][j+4]=='*')
{
printf("Win %d %d",j,i);
return 0;
}
//打竖判断
if(i+4<N&&pan[i+1][j]=='*'&&pan[i+2][j]=='*'
&&pan[i+3][j]=='*'&&pan[i+4][j]=='*')
{
printf("Win %d %d",j,i);
return 0;
}
//斜右下判断
if(i+4<N&&j+4<N&&pan[i+1][j+1]=='*'&&pan[i+2][j+2]=='*'
&&pan[i+3][j+3]=='*'&&pan[i+4][j+4]=='*')
{
printf("Win %d %d",j,i);
return 0;
}
//斜左下判断
if(i+4<N&&j-4<N&&pan[i+1][j-1]=='*'&&pan[i+2][j-2]=='*'
&&pan[i+3][j-3]=='*'&&pan[i+4][j-4]=='*')
{
printf("Win %d %d",j-4,i+4); //因为是斜左下,所以最左边第一颗棋子应该是最下面的一颗
return 0;
}
}
}
}
printf("Not yet");
return 0;
}