问题描述
五子棋想必大家都玩过,如果没有那我只能重新介绍一下规则了,当横竖斜(共八个方向)出现5个同色棋子时,则认为该颜色棋的选手获胜。郭姐被邀请做为一场五子棋比赛的解说员,他的任务就是判断对于给定的棋盘和黑白棋子,判断两个选手的输赢,两个选手的棋子分别用A,B表示,若最终A赢则输出A,反之输出B,题目保证有且仅有一个玩家获胜,不会出现平局情况。
输入描述
第一行输入一个整数n表示需要判断的棋盘的个数
接下来n组数据,每组数据第一行输入x,y(5<= x, y <= 100)表示棋盘的大小
接下来是一个x * y大小的矩阵,'A'表示选手A的棋子位置,'B'表示选手B的棋子,位置'X'(大写字母X)表示没有放置棋子输出描述
对于每一组测试样例,输出‘Case X:’接着
输出一个字母A表示选手'A'获胜或输出一个字母'B'表示选手B获胜,每组样例单独占一行样例输入
2 5 5 AAAXA BAAAA BBXXX AAAAA BBBAA 5 6 BAAAAB ABAAAB AABABB XXABAA AAAABB样例输出
Case 1:A Case 2:B来源
2016年中北大学新生赛
苍天啊,临睡之前写个博客,可算过了
#include<cstdio>
#include<iostream>
using namespace std;
int cnt1,cnt2;
char s[105][105];
int n,x,y;
int cnt;
int dir[8][2]= {{-1,1},{0,1},{1,1},{1,0}};
bool dfs(char a,int tx,int ty) {
int nx,ny;
for(int i=0;i<4;i++) {
cnt=0;
nx=tx;
ny=ty;
for(int j=0;j<4;j++) {
nx=nx+dir[i][0];
ny=ny+dir[i][1];
if(nx<0||nx>=x||ny<0||ny>=y) break;
if(a!=s[nx][ny]) break;
else cnt++;
}
if(cnt==4) return 1;
}
//要在循环里面判断cnt的数量
return 0;
}
int main()
{
scanf("%d",&n);
int kase=1;
while(n--)
{
scanf("%d%d",&x,&y);
for(int i=0; i<x; i++)
{
scanf("%s",s[i]);
}
int x1=0,y1=0;
bool flag=0;
for(int i=0; i<x; i++)
{
for(int j=0; j<y; j++)
{
if(s[i][j]!='X'&&dfs(s[i][j],i,j)) {
x1=i,y1=j;
flag=1;
break;
}
}
if(flag) break;
}
printf("Case %d:%c\n",kase++,s[x1][y1]);
//如果x1,y1不初始化会爆内存
}
return 0;
}
补上代码