黑白棋

黑白棋

Problem Description

黑白棋是一种喜闻乐见的益智游戏,今天,我们就来玩一下。
黑白棋的棋盘由 8×8 的方格组成。棋子为黑色(黑方的棋子)或白色(白方的棋子),下棋时棋子放置在方格内。
每轮游戏的规则是,双方交替下棋,将自己颜色的棋子放在棋盘的空格上,而当自己放下的棋子在横、竖、斜 8 个方向内有一个自己的棋子,则被夹在中间的所有连续的对方棋子全部会翻转成为自己颜色的棋子(可以横着夹,竖着夹,或是斜着夹,被夹住的位置必须全部是对手的棋子,且中间不能有空格),允许同时在多个方向上翻转。
只有当在一个位置落下一个棋子,并且能翻转对手一个或多个棋子时,这个位置才是一个有效的下棋位置。当轮到某人时,可能存在一个或多个有效的下棋位置,也可能不存在有效的下棋位置。
Input

输入数据有多组(数据组数不超过 50),到 EOF 结束。
对于每组数据:
第一行输入一个字符串,为 “BLACK” 或 “WHITE”,表示现在轮到哪一方下棋。
接下来输入 8 行字符串,每行字符串包含 8 个字符,表示当前盘面。其中 ‘.’ 表示空白位置,’B’ 表示黑棋,’W’ 表示白棋。
最后一行输入用空格隔开的两个整数 a, b,表示棋手想要下棋的位置(第 a 行 第 b 列)。
Output

对于每组数据,如果当前棋手的下棋位置有效,则输出下棋之后的盘面和黑白棋手各自的得分,否则只输出一行 “invalid”(不包含引号)。
Example Input

BLACK
........
........
........
...WB...
...BW...
........
........
........
4 3
WHITE
........
........
....W...
..BBBB..
...WBB..
..W.....
........
........
5 7

Example Output

........
........
..BBB...
...BW...
........
........
........
4:1
........
........
....W...
..BBBW..
...WWWW.
..W.....
........
........
3:7

Hint

对于第一组示例,对应题目描述中的图片。
对于第二组示例,白方下棋位置在 (5, 7),是一个有效位置。以 (5, 7) 为中心的 8 个方向中,向左可以和 (5, 4) 处的白棋一起夹住并翻转 2 个黑棋,向左上可以和 (3, 5) 处的白棋一起夹住翻转 1 个黑棋。
Author

「2016级《程序设计基础(B)I》期末上机考试-第一场」bLue

#include <iostream>
#include <stdio.h>
#include <string.h>
#include <stdbool.h>
int kk;
int xj, yj;
char space[10][10];
int dd[8][2]={{-1, 0}, {1, 0}, {0, -1}, {0, 1}, {-1, -1}, {-1, 1},{ 1, -1}, {1, 1}};

using namespace std;
bool border(int x, int y)
{
    if(x<=7&&y<=7&&x>=0&&y>=0)return true;
    else return false;
}
int color(int x, int y)
{
    if(space[x][y]=='W')return 1;
    else if(space[x][y]=='B')return -1;
    else return 0;
}
int ottf(int x, int y)
{
    int pi=0;
    for(int a=0; a<=7; a++)
    {
        int dx=x, dy=y;
        int ccot=0;
        int ktpi=0;
        while(border(dx+dd[a][0], dy+dd[a][1]))
        {
            dx+=dd[a][0];
            dy+=dd[a][1];
            if(color(dx, dy)*-1==kk)ccot=1;
            else
            {
                if(ccot&&color(dx, dy)==kk)
                {
                        pi=1;
                        ktpi=1;
                }
                break;
            }
        }
        if(ktpi)
        {
            dx=x, dy=y;
            while(color(dx+dd[a][0], dy+dd[a][1])*-1==kk)
            {
                dx+=dd[a][0];
                dy+=dd[a][1];
                if(color(dx, dy)==1)
                {
                    space[dx][dy]='B';
                    yj--, xj++;
                }
                else if(color(dx, dy)==-1)
                {
                    space[dx][dy]='W';
                    xj--, yj++;
                }
            }
        }
    }
    if(kk==1)
    {
        space[x][y]='W';
        yj++;
    }
    else
    {
        space[x][y]='B';
        xj++;
    }
    return pi;
}
int main()
{
    string name;
    string str1="BLACK", str2="WHITE";
    while(cin>>name)
    {
        getchar();
        xj=0, yj=0;
        if(name==str1)kk=-1;
        else if(name==str2)kk=1;
        for(int a=0; a<8; a++)
        {
            gets(space[a]);
            for(int b=0; b<8; b++)
            {
                if(space[a][b]=='B')xj++;
                else if(space[a][b]=='W')yj++;
            }
        }
        int dx, dy;
        scanf("%d%d", &dx, &dy);
        if(ottf(dx-1, dy-1))
        {
            for(int a=0; a<8; a++)
                printf("%s\n", space[a]);
            printf("%d:%d\n", xj, yj);
        }
        else printf("invalid\n");
    }
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值