2015ccpc G - Ancient Go(围棋dfs爆搜)

点击打开链接



题意:给定一个9*9的棋盘,问黑子能否在下一步将白子围住。

由于数据不大,可以直接将'.'换成'x',用DFS搜索。


AC code

#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
using namespace std;
typedef long long ll;

char chess[11][11];
bool visit[11][11];
int turnx[4]={1,-1,0,0};
int turny[4]={0,0,1,-1};
int flag;

bool in(int x,int y)
{
    if(x<0||y<0||x>=9||y>=9)
        return 0;
    return 1;
}

void dfs(int x,int y)//寻找以o为初始点周围是不是没有出路了,即没有.出现
{
    if(chess[x][y]=='.')//如果有出路,则标记为0,说明在该点下子无法获胜
    {
        flag=0;
        return;
    }
    for(int k=0;k<4;k++)
    {
        int nx=x+turnx[k];
        int ny=y+turny[k];
        if(in(nx,ny)&&!visit[nx][ny]&&chess[nx][ny]!='x')
        {
            visit[nx][ny]=1;
            dfs(nx,ny);
        }
    }
}

int solve()
{
    for(int i=0;i<9;i++)
    {
        for(int j=0;j<9;j++)
        {
            if(chess[i][j]=='.')
            {
                chess[i][j]='x';
                for(int k=0;k<4;k++)
                {
                    int nx=i+turnx[k];
                    int ny=j+turny[k];
                    if(in(nx,ny)&&chess[nx][ny]=='o')
                    {
                        memset(visit,0,sizeof(visit));
                        visit[nx][ny]=1;
                        flag=1;
                        dfs(nx,ny);
                        if(flag)  return 1;//直接返回,跳出循环
                    }
                }
                chess[i][j]='.';//还原
            }
        }
    }
    return 0;
}

int main()
{
    int T,cas=1;scanf("%d",&T);
    while(T--)
    {
        for(int i=0;i<9;i++)  scanf("%s",chess[i]);
        flag=1;
        memset(visit,0,sizeof(visit));
        int ans=solve();
        if(ans)  printf("Case #%d: Can kill in one move!!!\n",cas++);
        else  printf("Case #%d: Can not kill in one move!!!\n",cas++);
    }
    return 0;
}


猜你喜欢

转载自blog.csdn.net/Egqawkq/article/details/78650209
今日推荐