题目描述:
输入一个19*19的矩阵,只包含数字0、1、2,表示两人下五子棋的棋牌状态,1
题目描述:
输入一个19*19的矩阵,只包含数字0、1、2,表示两人下五子棋的棋牌状态,1、2分别表示两人的棋子,0表示空格。要求判断当前状态下是否有人获胜(横向、竖向或者斜线方向连成5个同色棋子)。题目说明输入样例保证每条线上至多只有连续5个同色棋子,并且保证至多只有1人获胜。如果有人获胜,输出获胜者(1或2)加一个冒号,接着输出获胜的五连珠的第一个棋子的坐标,从上到下从左到右序号最小的为第一个,序号从1开始编号。如果无人获胜,输出no。
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<math.h>
int a[30][30],vis[30][30];//vis是标记棋盘 看四个方向是否有五子连珠; a是棋盘两人下棋情况
bool flag;//是否有五子棋 flase没有 true有
int aimx,aimy;//表示标号 分别是下标+1
//row行 col列 winner是a[i][j]中1和2两人 dir是四个方向的遍历 step是步数
void dfs(int row,int col,int winner,int dir,int step)
{
if(row<0||row>=19||col<0||col>=19)return ; //棋盘外不算
if(a[row][col]==0)return ; //空子不算
if(winner!=a[row][col])return ;
if(step==4) //step=4表示有01234五颗子连起来了
{
flag=true;
printf("%d:(%d,%d)\n",winner,aimx,aimy);
return ;
}
if(dir==0) //标记vis右
{
if(vis[row][col+1])return ; //如果遍历过 即标记为1了 就不遍历了 就是5子被打断了 返回
vis[row][col+1]=1;
dfs(row,col+1,winner,dir,step+1);
}
else if(dir==1) //右下
{
if(vis[row+1][col+1])return ; //如果遍历过 即标记为1了 就不遍历了 就是5子被打断了 返回
vis[row+1][col+1]=1;
dfs(row+1,col+1,winner,dir,step+1);
}
else if(dir==2) //下
{
if(vis[row+1][col])return ; //如果遍历过 即标记为1了 就不遍历了 就是5子被打断了 返回
vis[row+1][col]=1;
dfs(row+1,col,winner,dir,step+1);
}
else if(dir==3) //左下
{
if(vis[row+1][col-1])return ; //如果遍历过 即标记为1了 就不遍历了 就是5子被打断了 返回
vis[row+1][col-1]=1;
dfs(row+1,col-1,winner,dir,step+1);
}
}
int main()
{
int i,j,k;
for(i=0;i<19;i++)
{
for(j=0;j<19;j++)
{
scanf("%d",&a[i][j]);//输入棋盘
}
}
memset(vis,0,sizeof(vis));
flag=false;
for(i=0;i<19;i++)
{
for(j=0;j<19;j++)
{
if(a[i][j]!=0)
{
aimx=i+1,aimy=j+1;//开始的第一个旗子坐标
for(k=0;k<4;k++)
{
dfs(i,j,a[i][j],k,0);
}
}
}
}
if(!flag)printf("no\n");
return 0;
}