您的位置:首页 > 编程语言 > Go语言

HDU 5546 Ancient Go

2015-11-27 13:00 447 查看
数据范围小,可以写得很暴力

枚举下棋的位置,然后再检查,可以dfs,可以bfs,还可以并查集

#include <cstdio>
#include <cstring>

char maze[12][12];
bool vis[12][12];

bool dfs(int r, int c)
{
vis[r][c] = true;
if(maze[r][c] == '.') return true;
if(maze[r][c] == 'x') return false;
if(!vis[r + 1][c] && maze[r + 1][c] && dfs(r + 1, c)) return true;
if(!vis[r - 1][c] && maze[r - 1][c] && dfs(r - 1, c)) return true;
if(!vis[r][c + 1] && maze[r][c + 1] && dfs(r, c + 1)) return true;
if(!vis[r][c - 1] && maze[r][c - 1] && dfs(r, c - 1)) return true;
return false;
}
bool judge()
{
for(int i = 1; i <= 9; i++)
for(int j = 1; j <= 9; j++)
{
if(maze[i][j] != 'o') continue;
memset(vis, false, sizeof(vis));
if(!dfs(i, j)) return true;
}
return false;
}
bool solve()
{
for(int i = 1; i <= 9; i++)
for(int j = 1; j <= 9; j++)
{
if(maze[i][j] != '.') continue;
maze[i][j] = 'x';
if(judge()) return true;
maze[i][j] = '.';
}
return false;
}

int main()
{
int T;
scanf("%d", &T);

for(int ca = 1; ca <= T; ca++)
{
memset(maze, 0, sizeof(maze));
for(int i = 1; i <= 9; i++)
scanf("%s", maze[i] + 1);
if(solve())
printf("Case #%d: Can kill in one move!!!\n", ca);
else
printf("Case #%d: Can not kill in one move!!!\n", ca);
}

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