Ancient Go HDU - 5546

14 篇文章 0 订阅
8 篇文章 0 订阅

下的棋类似于围棋,只要一方把另一方围起来使得另一方的棋子没有空格块可以相邻,便算作Kill,问黑方能否kill掉白方至少一个棋子
其实就是简单的找白方的连同块 顺带着判断这个连同块有没有空白格相邻,如果只有一个空白格相邻,那么就可以让黑方把棋子下在这个位置 从而Kill白方的棋子

//leehaoze
#include <iostream>
#include <deque>
#include <string>
#include <vector>
#include <queue>
#include <cstdio>
#include <stack>
#include <algorithm>
#include <cstring>
#include <cctype>
#include <cstdio>
#include <cmath>
#include <cstdlib>

using namespace std;
const int INF = 1<<29;
#define INC_SAT( val ) (val = ((val)+1 > (val)) ? (val)+1 : (val))
#define ARR_SIZE( a ) ( sizeof( (a) ) / sizeof( (a[0]) ) )
#define ULL unsigned long long

#define MAXN 10

struct Pos{
    Pos(int x,int y):x_(x),y_(y){}
    int x_,y_;
};

int Move_X[] = {0, 0, 1,-1};
int Move_Y[] = {1,-1, 0, 0};

char map[MAXN][MAXN];
bool visit[MAXN][MAXN];
bool visit_empty[MAXN][MAXN];
vector<Pos> O;

void Input(){
    O.clear();
    for (int i = 0; i < 9; ++i) {
        for (int j = 0; j < 9; ++j) {
            scanf("%c",&map[i][j]);
            if(map[i][j] == 'o'){
                O.push_back(Pos(i,j));
            }
        }
        getchar();
    }
}

bool Legal_Empty(int dx,int dy){
    return dx >= 0 && dy >= 0 && dx < 9 && dy < 9 && !visit_empty[dx][dy] && map[dx][dy] == '.';
}

bool Legal(int dx,int dy){
    return dx >= 0 && dy >= 0 && dx < 9 && dy < 9 && !visit[dx][dy] && map[dx][dy] == 'o';
}

bool BFS(Pos start){
    queue<Pos> Q;
    Q.push(start);
    visit[start.x_][start.y_] = true;
    int empty = 0;
    memset(visit_empty,false,sizeof visit_empty);
    while(!Q.empty()){
        Pos now = Q.front();
        Q.pop();
        for (int i = 0; i < 4; ++i) {
            int dx = now.x_ + Move_X[i];
            int dy = now.y_ + Move_Y[i];
            if(Legal_Empty(dx,dy)){
                visit_empty[dx][dy] = true;
                ++empty;
            }
        }
        for (int i = 0; i < 4; ++i) {
            int dx = now.x_ + Move_X[i];
            int dy = now.y_ + Move_Y[i];
            if(Legal(dx,dy)){
                visit[dx][dy] = true;
                Q.push(Pos(dx,dy));
            }
        }
    }
    if(empty == 1)return true;
    else return false;

}

bool Search(){
    memset(visit,false,sizeof visit);
    for (int i = 0; i < O.size(); ++i) {
        Pos now = O[i];
        if(visit[now.x_][now.y_])continue;
        if(BFS(now)){
            return true;
        }
    }
    return false;
}

void Print(){
    for (int i = 0; i < 9; ++i) {
        for (int j = 0; j < 9; ++j) {
            printf("%c",map[i][j]);
        }
        printf("\n");
    }
}

int main() {
//    freopen("IN.txt", "r", stdin);
    int T,cases = 1;
    scanf("%d",&T);
    getchar();
    while(T--){
        getchar();
        Input();
        printf("Case #%d: ",cases++);
        if(Search()){
            printf("Can kill in one move!!!\n");
        }
        else{
            printf("Can not kill in one move!!!\n");
        }
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值