Five-In-a-Row
题目链接:点击这里
题意:
Alice and Bob在下五子棋,Alice用X,Bob用O。现在轮到Alice下了,判断Alice再下一子是否能赢。
题解:
再下一子能连成五子一共有5种情况。遍历棋盘,从中截取连续的5个格,判断是否为5种情况之一。截取方式一共有4种,分别是横向截取,纵向截取,右上截取,右下截取。其中斜向截取又分为对角线上部和对角线下部。截取时横坐标纵坐标的转换需要一点逻辑思维。
代码:
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
#define chec if(check()){flag=1;break;}
char map[11][11];
char goal[5][6]= {".XXXX","X.XXX","XX.XX","XXX.X","XXXX."};
char now[6];
int check()
{
for(int i=0; i<5; i++)
if(strcmp(goal[i],now)==0)
return 1;
return 0;
}
int main()
{
while(~scanf("%s",map[0]))
{
for(int i=1; i<10; i++)
scanf("%s",map[i]);
int flag=0;
for(int i=0; i<10; i++)
{
for(int j=0; j<6; j++)
{
for(int k=0; k<5; k++) //横向截取
now[k]=map[i][j+k];
now[5]=0;
chec;
for(int k=0; k<5; k++) //纵向截取
now[k]=map[j+k][i];
now[5]=0;
chec;
}
if(flag)
break;
}
for(int i=0; i<6; i++)
{
for(int j=0; j<6-i; j++)//右下截取
{
for(int k=0; k<5; k++)
now[k]=map[j+k][i+j+k];
now[5]=0;
chec;
for(int k=0; k<5; k++)
now[k]=map[i+j+k][j+k];
now[5]=0;
chec;
}
if(flag)
break;
}
for(int i=0;i<6;i++)
{
for(int j=0;j<6-i;j++)//右上截取
{
for(int k=0;k<5;k++)
now[k]=map[i+j+k][9-j-k];
now[5]=0;
chec;
for(int k=0;k<5;k++)
now[k]=map[j+k][9-i-j-k];
now[5]=0;
chec;
}
if(flag)
break;
}
if(flag)
printf("YES\n");
else
printf("NO\n");
}
return 0;
}