HDU3368_翻转棋

题目大意: 给你一个棋盘,然后一开始已经有黑白棋了,现在轮到黑棋下,如果你下得这个黑棋的八个方向,有方向存在连续的白棋,且也以一颗黑棋结束,那么两个黑棋中夹着的白棋就变成了黑棋。要求求最大能翻转掉多少白棋。 解题思路: 一开始没有看清楚题意,原来可以翻转掉多个方向的白棋。Dark must place a piece with the dark side up on the board, in such a position that there exists at least one straight (horizontal, vertical, or diagonal) occupied line between the new piece and another dark piece, with one or more contiguous light pieces between them. In the below situation, dark has the following options indicated by transparent pieces: 题意说明了at least one straight (horizontal, vertical, or diagonal) occupied line between the new piece and another dark piece 然后就直接搜咯,我是枚举每一个'D'点开始搜的。 代码:
#include
#include
#include
using namespace std;

const int MAX = 9;
char Map[MAX][MAX];
int dir[8][2] = {{ -1, 0}, { -1, 1}, {0, 1}, {1, 1},
    {1, 0}, {1, -1}, {0, -1}, { -1, -1}
};
int result;
bool visited[MAX][MAX];
int flagDir;
int remain;

void DFS1(int x, int y, int step, int d)
{
    x += dir[d][0];
    y += dir[d][1];
    if(x >= 0 && x < 8 && y >= 0 && y < 8)
    {
        if(Map[x][y] == 'L')
        {
            step++;
            DFS1(x, y, step, d);
        }
        else if(Map[x][y] == 'D')
        {
            remain += step;
        }
        else
            return ;
    }
}

void DFS(int x, int y, int step, int d)
{
    remain = 0;
    x += dir[d][0];
    y += dir[d][1];
    if(x >= 0 && x < 8 && y >= 0 && y < 8)
    {
        if(Map[x][y] == 'L')
        {
            visited[x][y] = true;
            step++;
            DFS(x, y, step, d);
        }
        else if(Map[x][y] == '*')
        {
            visited[x][y] = true;
            for(int i = 0; i < 8; i++)
            {
                if(visited[x + dir[i][0]][y + dir[i][1]] == false)
                    DFS1(x, y, 0, i);
            }
            step += remain;
            if(step > result)
                result = step;
        }
        else
            return ;
    }
}

void init()
{
    memset(visited, false, sizeof(visited));
}

int main(void)
{
    int n, cas_c = 1;
    scanf("%d", &n);
    while(n--)
    {
        result = 0;

        for(int i = 0; i < 8; i++)
            scanf("%s", Map[i]);
        for(int i = 0; i < 8; i++)
            for(int j = 0; j < 8; j++)
            {
                if(Map[i][j] == 'D')
                {
                    for(int h = 0; h < 8; h++)//方向
                    {
                        init();
                        DFS(i, j, 0, h);
                    }
                }
            }
        printf("Case %d: %d\n", cas_c++, result);
    }
    return 0;
}

转载于:https://www.cnblogs.com/cchun/archive/2012/02/14/2520227.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
黑白棋,又叫反(Reversi)、奥赛罗(Othello)、苹果翻转黑白棋在西方和日本很流行。游戏通过相互翻转对方的子,最后以盘上谁的子多来判断胜负。 子:黑白棋子每颗由黑白两色组成,一面白,一面黑,共64个(包括盘中央的4个)。子呈圆饼形。    盘:黑白棋盘由64格的正方格组成,游戏进行时子要下在格内。盘可分为“角”、“边”以及黑白棋“中腹”。现今的盘多以8x8较为普遍。 钟:正式的比赛中可以使用钟对选手的时间进行限制。非正式的对局中一般不使用钟。 黑白棋盘是一个有8*8方格的盘。下时将下在空格中间,而不是像围一样下在交叉点上。开始时在盘正中有两白两黑四个子交叉放置,黑总是先下子。    下子的方法把自己颜色的子放在盘的空格上,而当自己放下的子在横、竖、斜八个方向内有一个自己的子,则被夹在中间的全部翻转会成为自己的子。 并且,只有在可以翻转子的地方才可以下子。  如果玩家在盘上没有地方可以下子,则该玩家对手可以连下。双方都没有子可以下时局结束,以子数目来计算胜负,子多的一方获胜。在盘还没有下满时,如果一方的子已经被对方吃光,则局也结束。将对手子吃光的一方获胜。     每个“翻转”游戏开始时,盘上已经交叉放好了四颗子。其中两颗是黑,另两颗是白棋。黑总是先走。    当您的子在某一直线方向包围了对手的子时,就可以翻转这些子的颜色,使它们成为您方的颜色。例如,如果您执黑,并且看到在一排白棋的某一端是一颗黑,那么当您将一颗黑放在这一排的另一端时,所有的白棋都将翻转并变为黑!   所有的直线方向均有效:水平、垂直和斜线方向。    走的唯一规则是只能走包围并翻转对手的子。每一回合都必须至少翻转一颗对手的子。    按规则不能再走时,这一回合弃权。计算机会自动将控制权交给对方。 得分 “翻转”的计分方法非常简单。游戏过程中随时都显示黑数与白棋数。结束时最多的一方就是赢家。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值