您的位置:首页 > 其它

HDU5546

2016-05-19 17:54 162 查看
Problem: Ancient Go

Source: The 2015 China Collegiate Programming Contest

Description: 两个人下围棋,现在问你黑棋方下一步能不能吃掉至少一个白棋。

Solution: 我们先用DFS求出每个连通块。然后只需关注每个连通块外是否有少于或等于1个的空白位置。如果有,那么黑棋下一步直接就把自己的棋子放到该位置就能吃掉这个连通块。对这个题就是个模拟题。

Code(C++):

#include <stdio.h>
#include <string.h>

const int M=15;
const int E=9;
const int F=4;

const int dirx[]={0,0,1,-1};
const int diry[]={1,-1,0,0};

char map[M][M];

bool used[M][M];

int belong[M][M];
int num[E*E+5];
bool is_count[M][M][E*E+5];

int top;

void dfs(int x,int y,int top)
{
used[x][y]=true;
belong[x][y]=top;

for(int i=0;i<F;i++){
int tx=x+dirx[i];
int ty=y+diry[i];
if(tx>=1&&tx<=E&&ty>=1&&ty<=E&&
map[tx][ty]=='o'&&!used[tx][ty])
dfs(tx,ty,top);
}
}

int main()
{
int N,K=1;
for(scanf("%d",&N);N--;){

memset(map,0,sizeof(map));
memset(used,false,sizeof(used));
memset(belong,0,sizeof(belong));
memset(num,0,sizeof(num));
memset(is_count,false,sizeof(is_count));

char str[M];
for(int i=1;i<=E;i++){
scanf("%s",str+1);
for(int j=1;j<=E;j++)
map[i][j]=str[j];
}

top=0;
for(int i=1;i<=E;i++)
for(int j=1;j<=E;j++)
if(map[i][j]=='o'&&!used[i][j]){
++top;
dfs(i,j,top);
}

for(int i=1;i<=E;i++)
for(int j=1;j<=E;j++)
if(belong[i][j])
for(int k=0;k<F;k++){
int tx=i+dirx[k];
int ty=j+diry[k];

if((tx>=1&&tx<=E&&ty>=1&&ty<=E)&&
(belong[i][j]!=belong[tx][ty]&&
map[tx][ty]=='.'&&!is_count[tx][ty][belong[i][j]]))
++num[belong[i][j]],
is_count[tx][ty][belong[i][j]]=true;
}

bool flag=true;
for(int i=1;i<=top;i++)
if(num[i]<=1){
flag=false;
break;
}

printf("Case #%d: ",K++);
puts(flag? "Can not kill in one move!!!":"Can kill in one move!!!");

}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: