您的位置:首页 > 其它

2015 CCPC G题 【DFS 暴力】

2015-10-28 19:15 295 查看
题目链接 点我

题意:给定一个9*9的围棋局面,要求你先除去对方的死棋,再除去己方的死棋。对于当前局面,问能否通过一手棋吃掉对面至少一个子。

思路:对于每个.字符,先填上字符x,判断临近的o字符有没有被消灭。

#include <cstdio>
#include <cstring>
#include <cmath>
#include <cstdlib>
#include <algorithm>
#include <map>
#include <string>
#include <vector>
#define lson o<<1|1, l, mid
#define rson o<<1, mid+1, r
#define ll o<<1
#define rr o<<1|1
#define INF 0x3f3f3f3f
#define eps 1e-8
#define debug printf("1\n")
#define MAXN 10000
#define MAXM 100000
#define LL long long
#define CLE(a, b) memset(a, (b), sizeof(a))
#define W(a) while(a--)
#define Ri(a) scanf("%d", &a)
#define Pi(a) printf("%d\n", (a))
#define Rl(a) scanf("%lld", &a)
#define Pl(a) printf("%lld\n", (a))
#define Rs(a) scanf("%s", a)
#define Ps(a) printf("%s\n", (a))
using namespace std;
char str[10][10];
int vis[10][10];
int Move[4][2] = {0,1, 0,-1, 1,0, -1,0};
bool judge(int x, int y){
return  x >= 0 && x < 9 && y >= 0 && y < 9;
}
bool kill(int x, int y)
{
vis[x][y] = true;
for(int i = 0; i < 4; i++)
{
int next_x = x + Move[i][0];
int next_y = y + Move[i][1];
if(vis[next_x][next_y] || !judge(next_x, next_y)) continue;
if(str[next_x][next_y] == '.' || (str[next_x][next_y] == 'o' && !kill(next_x, next_y)))
return false;
}
return true;
}
bool can(int x, int y)
{
str[x][y] = 'x';
for(int i = 0; i < 4; i++)
{
int next_x = x + Move[i][0];
int next_y = y + Move[i][1];
if(judge(next_x, next_y) && str[next_x][next_y] == 'o')
{
memset(vis, false, sizeof(vis));
if(kill(next_x, next_y))
return true;
}
}
str[x][y] = '.';
return false;
}
int main()
{
int t, kcase = 1;
Ri(t);
W(t)
{
for(int i = 0; i < 9; i++)
Rs(str[i]);
bool flag = false;
for(int i = 0; i < 9; i++)
{
for(int j = 0; j < 9; j++)
{
if(str[i][j] == '.')
{
if(can(i, j))
{
flag = true;
break;
}
}
if(flag)
break;
}
if(flag)
break;
}
if(flag)
printf("Case #%d: Can kill in one move!!!\n", kcase++);
else
printf("Case #%d: Can not kill in one move!!!\n", kcase++);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: