黑白棋
Time Limit: 1000 ms Memory Limit: 65536 KiB
Problem Description
黑白棋是一种喜闻乐见的益智游戏,今天,我们就来玩一下。
黑白棋的棋盘由 8×8 的方格组成。棋子为黑色(黑方的棋子)或白色(白方的棋子),下棋时棋子放置在方格内。
每轮游戏的规则是,双方交替下棋,将自己颜色的棋子放在棋盘的空格上,而当自己放下的棋子在横、竖、斜 8 个方向内有一个自己的棋子,则被夹在中间的所有连续的对方棋子全部会翻转成为自己颜色的棋子(可以横着夹,竖着夹,或是斜着夹,被夹住的位置必须全部是对手的棋子,且中间不能有空格),允许同时在多个方向上翻转。
只有当在一个位置落下一个棋子,并且能翻转对手一个或多个棋子时,这个位置才是一个有效的下棋位置。当轮到某人时,可能存在一个或多个有效的下棋位置,也可能不存在有效的下棋位置。
例如:当前轮到黑方下棋,他的有效下棋位置在图中以凹陷效果标出。
选择 4-C 位置下棋,则中间被夹住的白棋全部翻转为黑棋:
现在给你一个当前棋局的盘面,并且给出这一轮下棋的人的执子颜色以及他想要下棋的位置,请你判断一下他的下棋位置是否是有效位置,如果是,则输出下棋之后的盘面。
Input
输入数据有多组(数据组数不超过 50),到 EOF 结束。
对于每组数据:
- 第一行输入一个字符串,为 "BLACK" 或 "WHITE",表示现在轮到哪一方下棋。
- 接下来输入 8 行字符串,每行字符串包含 8 个字符,表示当前盘面。其中 '.' 表示空白位置,'B' 表示黑棋,'W' 表示白棋。
- 最后一行输入用空格隔开的两个整数 a, b,表示棋手想要下棋的位置(第 a 行 第 b 列)。
Output
对于每组数据,如果当前棋手的下棋位置有效,则输出下棋之后的盘面和黑白棋手各自的得分,否则只输出一行 “invalid”(不包含引号)。
Sample Input
BLACK
........
........
........
...WB...
...BW...
........
........
........
4 3
WHITE
........
........
....W...
..BBBB..
...WBB..
..W.....
........
........
5 7
Sample Output
........
........
..BBB...
...BW...
........
........
........
4:1
........
........
....W...
..BBBW..
...WWWW.
..W.....
........
........
3:7
Hint
对于第一组示例,对应题目描述中的图片。
对于第二组示例,白方下棋位置在 (5, 7),是一个有效位置。以 (5, 7) 为中心的 8 个方向中,向左可以和 (5, 4) 处的白棋一起夹住并翻转 2 个黑棋,向左上可以和 (3, 5) 处的白棋一起夹住翻转 1 个黑棋。
Source
【2016级《程序设计基础(B)I》期末上机考试-第一场】bLue
废了很大的力气才写出来 存一下留念吧 哈哈哈 300行
#include <bits/stdc++.h>
using namespace std;
char s1[10];
char s[10][10];
int main()
{
int n, m;
while (~scanf("%s", s1))
{
int flag = 0;
for (int i = 1; i <= 8; i++)
{
for (int j = 1; j <= 8; j++)
cin >> s[i][j];
}
if (strcmp(s1, "BLACK") == 0)
{
cin >> n >> m;
s[n][m] = 'B';
for (int i = m + 1; i <= 8; i++) // 找右
{
if (s[n][i] == '.')
break;
if (s[n][i] == 'W')
continue;
if (s[n][i] == 'B')
{
for (int j = i - 1; j >= m + 1; j--)
{
s[n][j] = 'B';
flag = 1;
}
break;
}
}
for (int i = m - 1; i >= 0; i--) // 左
{
if (s[n][i] == '.')
break;
if (s[n][i] == 'W')
continue;
if (s[n][i] == 'B')
{
for (int j = i + 1; j <= m - 1; j++)
{
s[n][j] = 'B';
flag = 1;
}
break;
}
}
for (int i = 1; n + i <= 8; i++) // 找下
{
if (s[n + i][m] == '.')
break;
if (s[n + i][m] == 'W')
continue;
if (s[n + i][m] == 'B')
{
for (int j = 1; j <= i - 1; j++)
{
s[n + j][m] = 'B';
flag = 1;
}
break;
}
}
for (int i = 1; n - i >= 0; i++) // 上
{
if (s[n - i][m] == '.')
break;
if (s[n - i][m] == 'W')
continue;
if (s[n - i][m] == 'B')
{
for (int j = 1; j <= i - 1; j++)
{
s[n - j][m] = 'B';
flag = 1;
}
break;
}
}
for (int i = 1; n - i >= 0 && m + i <= 8; i++) // 右上
{
if (s[n - i][m + i] == '.')
break;
if (s[n - i][m + i] == 'W')
continue;
if (s[n - i][m + i] == 'B')
{
for (int j = 1; j <= i - 1; j++)
{
s[n - j][m + j] = 'B';
flag = 1;
}
break;
}
}
for (int i = 1; n + i <= 8 && m - i >= 0; i++) // 左下
{
if (s[n + i][m - i] == '.')
break;
if (s[n + i][m - i] == 'W')
continue;
if (s[n + i][m - i] == 'B')
{
for (int j = 1; j <= i - 1; j++)
{
s[n + j][m - j] = 'B';
flag = 1;
}
break;
}
}
for (int i = 1; n - i >= 0 && m - i >= 0; i++) // 左上
{
if (s[n - i][m - i] == '.')
break;
if (s[n - i][m - i] == 'W')
continue;
if (s[n - i][m - i] == 'B')
{
for (int j = 1; j <= i - 1; j++)
{
s[n - j][m - j] = 'B';
flag = 1;
}
break;
}
}
for (int i = 1; n + i <= 8 && m + i <= 8; i++) // 右下
{
if (s[n + i][m + i] == '.')
break;
if (s[n + i][m + i] == 'W')
continue;
if (s[n + i][m + i] == 'B')
{
for (int j = 1; j <= i - 1; j++)
{
s[n + j][m + j] = 'B';
flag = 1;
}
break;
}
}
}
if (strcmp(s1, "WHITE") == 0)
{
cin >> n >> m;
s[n][m] = 'W';
for (int i = m + 1; i <= 8; i++) // 找右
{
if (s[n][i] == '.')
break;
if (s[n][i] == 'B')
continue;
if (s[n][i] == 'W')
{
for (int j = i - 1; j >= m + 1; j--)
{
s[n][j] = 'W';
flag = 1;
}
break;
}
}
for (int i = m - 1; i >= 0; i--) // 左
{
if (s[n][i] == '.')
break;
if (s[n][i] == 'B')
continue;
if (s[n][i] == 'W')
{
for (int j = i + 1; j <= m - 1; j++)
{
s[n][j] = 'W';
flag = 1;
}
break;
}
}
for (int i = 1; n + i <= 8; i++) // 找下
{
if (s[n + i][m] == '.')
break;
if (s[n + i][m] == 'B')
continue;
if (s[n + i][m] == 'W')
{
for (int j = 1; j <= i - 1; j++)
{
s[n + j][m] = 'W';
flag = 1;
}
break;
}
}
for (int i = 1; n - i >= 0; i++) // 上
{
if (s[n - i][m] == '.')
break;
if (s[n - i][m] == 'B')
continue;
if (s[n - i][m] == 'W')
{
for (int j = 1; j <= i - 1; j++)
{
s[n - j][m] = 'W';
flag = 1;
}
break;
}
}
for (int i = 1; n - i >= 0 && m + i <= 8; i++) // 右上
{
if (s[n - i][m + i] == '.')
break;
if (s[n - i][m + i] == 'B')
continue;
if (s[n - i][m + i] == 'W')
{
for (int j = 1; j <= i - 1; j++)
{
s[n - j][m + j] = 'W';
flag = 1;
}
break;
}
}
for (int i = 1; n + i <= 8 && m - i >= 0; i++) // 左下
{
if (s[n + i][m - i] == '.')
break;
if (s[n + i][m - i] == 'B')
continue;
if (s[n + i][m - i] == 'W')
{
for (int j = 1; j <= i - 1; j++)
{
s[n + j][m - j] = 'W';
flag = 1;
}
break;
}
}
for (int i = 1; n - i >= 0 && m - i >= 0; i++) // 左上
{
if (s[n - i][m - i] == '.')
break;
if (s[n - i][m - i] == 'B')
continue;
if (s[n - i][m - i] == 'W')
{
for (int j = 1; j <= i - 1; j++)
{
s[n - j][m - j] = 'W';
flag = 1;
}
break;
}
}
for (int i = 1; n + i <= 8 && m + i <= 8; i++) // 右下
{
if (s[n + i][m + i] == '.')
break;
if (s[n + i][m + i] == 'B')
continue;
if (s[n + i][m + i] == 'W')
{
for (int j = 1; j <= i - 1; j++)
{
s[n + j][m + j] = 'W';
flag = 1;
}
break;
}
}
}
if (!flag)
cout << "invalid" << endl;
else
{
for (int i = 1; i <= 8; i++)
{
for (int j = 1; j <= 8; j++)
printf("%c", s[i][j]);
cout << endl;
}
int w = 0, b = 0;
for (int i = 1; i <= 8; i++)
{
for (int j = 1; j <= 8; j++)
{
if (s[i][j] == 'B')
b++;
else if (s[i][j] == 'W')
w++;
}
}
cout << b << ":" << w << endl;
}
}
return 0;
}
/***************************************************
User name: jk180602
Result: Accepted
Take time: 0ms
Take Memory: 156KB
Submit time: 2019-01-04 22:40:10
****************************************************/