【问题描述】
已知两人分别执白棋和黑棋在一个围棋棋盘上下五子棋,若同一颜色的棋子在同一条横行、纵行或斜线上连成5个棋子,则执该颜色棋子的人获胜。编写程序读入某一时刻下棋的状态,并判断是否有人获胜。
输入的棋盘大小是19×19,用数字0表示空位置(即没有棋子),用数字1表示该位置下了一白色棋子,用数字2表示该位置下了一黑色棋子。假设同一颜色的棋子在同一条横行、纵行或斜线上连成的棋子个数不会超过5个,并且最多有一人连成线的棋子个数为5。
【输入形式】
从控制台输入用来表示棋盘状态的数字0、1或2;每行输入19个数字,各数字之间以一个空格分隔,每行最后一个数字后没有空格;共输入19行表示棋盘状态的数字。
【输出形式】
若有人获胜,则先输出获胜人的棋子颜色(1表示白色棋子,2表示黑色棋子),然后输出英文冒号:,最后输出连成5个棋子连线的起始位置(棋盘横行自上往下、纵行自左往右从1开始计数,横行最小的棋子在棋盘上的横行数和纵行数作为连线的起始位置,两数字之间以一个英文逗号,作为分隔符)。
若没有人获胜,则输出英文字符串:No。
无论输出什么结果,最后都要有回车换行符。
【输入样例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 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 1 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
【输出样例1】
1:9,8
【输入样例2】
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 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
【输出样例2】
No
【样例说明】
在输入的样例1中,执白棋(数字1表示)的人已经获胜,连成5个棋子的起始位置在第9行第8列,所以输出1:9,8。
在输入的样例2中,还没有同一颜色的棋子连成5个,所以无人获胜,直接输出No。
【评分标准】
该题要求判断五子棋的棋盘状态,提交程序文件名为chess.c或chess.cpp。
//这道题采用二维数组来储存数据,算法的主要思想就是遍历然后判断第一个棋子的右边五个,左边五个,左下五个,右下五个是否连成五个一样的棋子。像这样,如下图:
最后需要注意的是i,j都是从0开始的,有的地方要加1.
下面附上我的代码段:
#include <stdio.h>
#include<iostream>
using namespace std;
int Heng(int a,int b,int qz,int A[19][19])
{
int i;
for(i=1;i<=4;i++)
{
if(b+i<19)
{
if(A[a][b+i]!=qz)
{
return 0;
}
}
else return 0;
}
return 1;
}
int zong(int a,int b,int qz,int A[19][19])
{
int i;
for(i=1;i<=4;i++)
{
if(a+i<19)
{
if(A[a+i][b]!=qz)
{
return 0;
}
}
else return 0;
}
return 1;
}
int youxie(int a,int b,int qz,int A[][19])
{
int i;
for(i=1;i<=4;i++)
{
if(a+i<19&&b+i<19)
{
if(A[a+i][b+i]!=qz)
{
return 0;
}
}
else return 0;
}
return 1;
}
int zuoxie(int a,int b,int qz,int A[][19])
{
int i;
for(i=1;i<=4;i++)
{
if(b-i>=0&&a+i<19)
{
if(A[a+i][b-i]!=qz)
{
return 0;
}
}
else return 0;
}
return 1;
}
int main()
{
int A[19][19];
int i,j;
int y1=0,y2=0;
for(i=0;i<19;i++)
{
for(j=0;j<19;j++)
{
cin>>A[i][j];
}
}
for(i=0;i<19;i++)
{
for(j=0;j<19;j++)
{
if(A[i][j]==1)
{
y1=Heng(i,j,1,A)||zong(i,j,1,A)||zuoxie(i,j,1,A)||youxie(i,j,1,A);
if(y1==1)
{
printf("1:%d,%d\n",i+1,j+1);
}
}
if(A[i][j]==2)
{
y2=Heng(i,j,2,A)||zong(i,j,2,A)||zuoxie(i,j,2,A)||youxie(i,j,2,A);
if(y2==1)
{
printf("2:%d,%d\n",i+1,j+1);
}
}
if(y1==1||y2==1) return 0;
}
}
if (y1 !=1 && y2 !=1)
{
printf("No\n");
}
return 0;
}