下的棋类似于围棋,只要一方把另一方围起来使得另一方的棋子没有空格块可以相邻,便算作Kill,问黑方能否kill掉白方至少一个棋子
其实就是简单的找白方的连同块 顺带着判断这个连同块有没有空白格相邻,如果只有一个空白格相邻,那么就可以让黑方把棋子下在这个位置 从而Kill白方的棋子
//leehaoze
#include <iostream>
#include <deque>
#include <string>
#include <vector>
#include <queue>
#include <cstdio>
#include <stack>
#include <algorithm>
#include <cstring>
#include <cctype>
#include <cstdio>
#include <cmath>
#include <cstdlib>
using namespace std;
const int INF = 1<<29;
#define INC_SAT( val ) (val = ((val)+1 > (val)) ? (val)+1 : (val))
#define ARR_SIZE( a ) ( sizeof( (a) ) / sizeof( (a[0]) ) )
#define ULL unsigned long long
#define MAXN 10
struct Pos{
Pos(int x,int y):x_(x),y_(y){}
int x_,y_;
};
int Move_X[] = {0, 0, 1,-1};
int Move_Y[] = {1,-1, 0, 0};
char map[MAXN][MAXN];
bool visit[MAXN][MAXN];
bool visit_empty[MAXN][MAXN];
vector<Pos> O;
void Input(){
O.clear();
for (int i = 0; i < 9; ++i) {
for (int j = 0; j < 9; ++j) {
scanf("%c",&map[i][j]);
if(map[i][j] == 'o'){
O.push_back(Pos(i,j));
}
}
getchar();
}
}
bool Legal_Empty(int dx,int dy){
return dx >= 0 && dy >= 0 && dx < 9 && dy < 9 && !visit_empty[dx][dy] && map[dx][dy] == '.';
}
bool Legal(int dx,int dy){
return dx >= 0 && dy >= 0 && dx < 9 && dy < 9 && !visit[dx][dy] && map[dx][dy] == 'o';
}
bool BFS(Pos start){
queue<Pos> Q;
Q.push(start);
visit[start.x_][start.y_] = true;
int empty = 0;
memset(visit_empty,false,sizeof visit_empty);
while(!Q.empty()){
Pos now = Q.front();
Q.pop();
for (int i = 0; i < 4; ++i) {
int dx = now.x_ + Move_X[i];
int dy = now.y_ + Move_Y[i];
if(Legal_Empty(dx,dy)){
visit_empty[dx][dy] = true;
++empty;
}
}
for (int i = 0; i < 4; ++i) {
int dx = now.x_ + Move_X[i];
int dy = now.y_ + Move_Y[i];
if(Legal(dx,dy)){
visit[dx][dy] = true;
Q.push(Pos(dx,dy));
}
}
}
if(empty == 1)return true;
else return false;
}
bool Search(){
memset(visit,false,sizeof visit);
for (int i = 0; i < O.size(); ++i) {
Pos now = O[i];
if(visit[now.x_][now.y_])continue;
if(BFS(now)){
return true;
}
}
return false;
}
void Print(){
for (int i = 0; i < 9; ++i) {
for (int j = 0; j < 9; ++j) {
printf("%c",map[i][j]);
}
printf("\n");
}
}
int main() {
// freopen("IN.txt", "r", stdin);
int T,cases = 1;
scanf("%d",&T);
getchar();
while(T--){
getchar();
Input();
printf("Case #%d: ",cases++);
if(Search()){
printf("Can kill in one move!!!\n");
}
else{
printf("Can not kill in one move!!!\n");
}
}
}