1.判断
读入某一时刻下棋的状态,并判断是否有人即将获胜,即:同一颜色的棋子在同一条横行、纵列或斜线上连成4个棋子,且该4个棋子的两端至少有一端为空位置。
要求:有人获胜时输出获胜的一方以及最前面的棋子的横纵坐标(横行小的优先输出),无人获胜时输出“No”。
思路:建立二维数组保存下棋时的状态,遍历数组,如果读到的字符不为‘0’.则同时判断:
A.四个方向(横、纵、左斜、右斜)是否有连续四个相同的字符
B.两端是否至少有一个位置为‘0’,即至少有一段空出来
#include <stdio.h>
#include <stdlib.h>
#define N 50
int qp[N][N];
int line(int a[][N],int i,int j)
{
int x=1;
for(x=1;x<4;x++) //判断横行是否有连续的四个相同棋子
{
if(a[i][j]!=a[i][j+x])
{
return 0;
}
}
if(a[i][j-1]!=0&&a[i][j+4]!=0) //判断左右两端是否有不同棋子
{
return 0;
}
return 1;
}
int row(int a[][N],int i,int j) // 判断纵行是否有连续的四个相同棋子
{
int y=1;
for(y=1;y<4;y++)
{
if(a[i][j]!=a[i+y][j])
{
return 0;
}
}
if(a[i-1][j]!=0&&a[i+4][j]!=0) //判断上下两端是否有不同的棋子
{
return 0;
}
return 1;
}
int left_up(int a[][N],int i,int j) //判断左上方向是否有连续相同的四个棋子
{
int x=1,y=1;
for(x=1;x<4;x++,y++)
{
if(a[i][j]!=a[i+x][j+y])
{
return 0;
}
}
if(a[i-1][j-1]!=0&&a[i+4][j+4]!=0) //判断斜方向两端是否有不同的棋子
{
return 0;
}
return 1;
}
int right_up(int a[][N],int i,int j) //判断右上方向是否有连续相同的四个棋子
{
int x=1,y=1;
for(x=1;x<4;x++,y++)
{
if(a[i][j]!=a[i+x][j-y])
{
return 0;
}
}
if(a[i-1][j+1]!=0&&a[i+4][j-4]!=0) //判断斜方向两端是否有不同的棋子
{
return 0;
}
return 1;
}
int main()
{
int i=0,j=0;
for(i=0;i<19;i++)
{
for(j=0;j<19;j++)
{
scanf("%d",&qp[i][j]); //输入棋盘
}
}
int flag=0; //设置标记判断胜负
for(i=0;i<19;i++)
{
if(flag!=0)
{
break;
}
for(j=0;j<19;j++)
{
if