hdu 5546 Ancient Go

本文介绍了一个简单的DFS算法实现,该算法用于判断是否能在棋盘的空白处放置一个标记以包围对手的棋子,从而赢得游戏。通过遍历棋盘并使用广度优先搜索(BFS),算法能够确定是否存在一招制胜的可能性。



题意,只要在空白的地方加一个x能围到一个o 就算赢。


就一个简单的dfs,我就不明白那错了, ,然后莫名其妙的就过了。

。。。卧槽。



真的好气凹。


#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<iostream>
#include<algorithm>
#include<vector>
#include<queue>
#include<map>
#include<set>
#define ll long long
using namespace std;

const int maxn = 100100;
const int inf = 0xfffffff;
char a[20][20];
int dir[4][2]={1,0,0,1,-1,0,0,-1};
struct node{
    int x,y;
};
node st,u,v;
int vis[20][20];
pair <int ,int>p;
map<pair<int ,int >,int>mm;
int bfs(int x,int y){
    queue<node>que;
    mm.clear();
    while(!que.empty()) que.pop();
    st.x=x;st.y=y;
    que.push(st);
    vis[x][y]=1;
    int ret=0,flag=1;
    while(!que.empty()){
        u=que.front();
        que.pop();
        for(int i=0;i<4;++i){
            v.x=u.x+dir[i][0];
            v.y=u.y+dir[i][1];
            if(v.x<1||v.y<1||v.x>9||v.y>9||vis[v.x][v.y]) continue;
            if(a[v.x][v.y]=='o') {
                que.push(v);vis[v.x][v.y]=1;
            }
            if(a[v.x][v.y]=='.') {
                p.first=v.x,p.second=v.y;
                if(!mm[p]) {
                    mm[p]=1;
                    if(ret==0) ret=1;
                    else flag=0;
                }
            }
        }
    }
    return flag;
}
int main() {
    int T,g,ca=1;
    cin>>T;
    while(T--){
        g=0;memset(vis,0,sizeof(vis));
        for(int i=1;i<=9;++i)
            scanf("%s",a[i]+1);
        for(int i=1;i<=9;++i){
            for(int j=1;j<=9;++j){
                if(a[i][j]=='o'&&!vis[i][j]){
                    g=bfs(i,j);
                    if(g) break;
                }
            }if(g) break;
        }
        printf("Case #%d: ",ca++);
        if(g) puts("Can kill in one move!!!");
        else puts("Can not kill in one move!!!");
    }
    return 0;
}
/*
23
xxxxxxxxx
xooooooox
oooooooxx
ooooooooo
ooooooooo
oooo.ooox
xxxxxxxxx
xxxxxxxxx
xxxxxxxxx
*/


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值