2015ccpc G

来源:互联网 发布:mac雪花高光粉饼试色 编辑:程序博客网 时间:2024/05/20 05:26

点击打开链接



题意:给定一个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;}