SDUTOJ3754_黑白棋(纯模拟)

黑白棋

Time Limit: 1000 ms Memory Limit: 65536 KiB

Submit Statistic

Problem Description

黑白棋是一种喜闻乐见的益智游戏,今天,我们就来玩一下。

黑白棋的棋盘由 8×8 的方格组成。棋子为黑色(黑方的棋子)或白色(白方的棋子),下棋时棋子放置在方格内。

每轮游戏的规则是,双方交替下棋,将自己颜色的棋子放在棋盘的空格上,而当自己放下的棋子在横、竖、斜 8 个方向内有一个自己的棋子,则被夹在中间的所有连续的对方棋子全部会翻转成为自己颜色的棋子(可以横着夹,竖着夹,或是斜着夹,被夹住的位置必须全部是对手的棋子,且中间不能有空格),允许同时在多个方向上翻转。

只有当在一个位置落下一个棋子,并且能翻转对手一个或多个棋子时,这个位置才是一个有效的下棋位置。当轮到某人时,可能存在一个或多个有效的下棋位置,也可能不存在有效的下棋位置。

 

例如:当前轮到黑方下棋,他的有效下棋位置在图中以凹陷效果标出。

3754

 

选择 4-C 位置下棋,则中间被夹住的白棋全部翻转为黑棋:

3754-2

 

现在给你一个当前棋局的盘面,并且给出这一轮下棋的人的执子颜色以及他想要下棋的位置,请你判断一下他的下棋位置是否是有效位置,如果是,则输出下棋之后的盘面。

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
****************************************************/

 

转载于:https://www.cnblogs.com/iQXQZX/p/10258736.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值