五子棋大师

时间限制: 1000 ms 内存限制: 65536 kb
总通过人数: 1 总提交人数: 2

题目介绍

自建党以来,我党经历了各种艰难困苦,才最终不断由胜利走向胜利。如果说,建国初期的整个中国是一张惊涛骇浪的棋盘,那与反动派的斗争无疑是一场针针见血的博弈。我党凭借着优秀的党内素质以及运筹帷幄的政治远见,赢下了这一场场惊心动魄的棋局。时至今日,我们依旧无法忘怀当年那运棋的风姿。

小x是一名五子棋小师。今天他遇到了五子棋大师ziyer,两人开始切磋棋艺。

请你当裁判,看看是否有人已经连成四子,并马上将要赢了。

具体来说,即:同一颜色的棋子在同一条横行、纵列或斜线上连成 $4$ 个棋子,且该 $4$ 个棋子的两端至少有一端为空位置。不需要考虑先后手,当前执棋人是谁的问题。不需要考虑两端各 $3$ 个棋子组成双十字等其他复杂的情况,只需要考虑这一种情况即可

输入格式

每一组数据为一个 $19\times 19$ 的数组,代表棋盘。

其中,棋盘上若是 $0$ 则代表此处未落子,是 $1$ 则代表黑子,是 $2$ 则代表白子。

每个测试点有不定组数据,请用EOF判结束。

输出格式

对于每组数据:

如果有人将要获胜: 第一行,一个数字(为 $1$ 或者 $2$ 的其中一个),如果是 $1$ 则代表黑子即将胜利,是 $2$ 则代表白子即将胜利。

第二行,一个整数,输出棋盘上黑子的个数。

第三行,两个整数,用空格分隔,代表连成4个棋子连线的起始位置的棋子坐标。(棋盘横行自上往下、纵列自左往右从 $1$ 开始计数,横行最小的棋子在棋盘上的横行数和纵列数作为连线的起始位置,若在同一行上,则纵列数最小的棋子位置作为起始位置)

如果没有人将要获胜: 输出NO

每组数据之间的输出用一个空行分隔。

输入样例

0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 2 0 1 1 2 0 0 0 0 0 0 0
0 0 0 0 0 2 1 1 1 1 2 2 0 0 0 0 0 0 0
0 0 0 0 0 0 0 1 2 1 2 0 0 0 0 0 0 0 0
0 0 0 0 0 0 1 1 0 2 2 0 0 0 0 0 0 0 0
0 0 0 0 0 2 0 1 0 0 2 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 1 2 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 1 2 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 1 2 2 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

输出样例

1
13
9 8

NO

样例解释

对于第一组数据: 以棋盘的左上角为第 $1$ 行第 $1$ 列,则从第 $9$ 行第 $8$ 列开始,往下共计 $4$ 个连续的黑子在统一纵列上,且该纵列的下方的是空位置。故黑子即将胜利。此时棋盘上黑子的总数为 $13$ 个。

对于第二组数据: 没有任何一方满足即将胜利的条件,故输出NO

数据范围

同一颜色的棋子在同一条横行、纵列或斜线上连成的棋子个数不会超过 $4$ 个,并且最多有一人连成线的棋子个数为 $4$ (即不会出现二人同时满足即将胜利条件的情况,也不会出现一人有两处满足胜利条件的情况)。

HINT1

在多组输入中,没有找到判断是否有新输入数据的标志性数据(比如说数据规模 $n$ 这样的,这道题的每一组数据只有 $361$ 个数,显然是没有这样的标志性数据的,又不能全都写在scanf函数当中进行判断)。

“每组数据固定输入 $10$ 个数”为例,我们有两种完成多组输入的方式:

while(!feof(stdin)) {
    int i;
    for(i = 0; i < 10; i++) scanf("%d", &a[i]);
    //do something
}

或者

while(scanf("%d", &temp) != EOF) {
    a[0] = temp;
    int i;
    for(i = 1; i < 10; i++) scanf("%d", &a[i]);
    //do something
}

请同学们将提示中的代码类推到本问题,选择自己喜欢的方式进行书写。

HINT2

关于如何求解本题,可以写一个函数,以某一棋子为首个棋子,向[下、右、左下、右下]四个方向,判断该棋子是否满足以其为首有四连且至少又一边有空格

对于棋盘中的每一个棋子,调用这个函数。

要考虑所有情况呦,小 心 越 界。

AUTHOR ziyer

相关推荐