题意:
点代表空格,相同棋子上下左右相连为一个分量,当一个分量不与点相连的时候这个分量就是死的,题目先把o死的分量去除,再把x死的分量去除,这之后再下一个x问能不能使一个o分量dead,最后这个就是判断有没有o分量所连的点只有一个
思路:
搜索三次即可
#include <iostream>
#include <cstdio>
#include <cmath>
#include <cstring>
#include <algorithm>
#include <set>
#include <queue>
using namespace std;
typedef long long ll;
const int maxn = 1e5 +10;
const int inf = 0x3f3f3f3f;
char ma[20][20];
char ma2[20][20];
int n,m;
int vis[20][20];
set<pair<int,int> > se;
set<pair<int,int> > se2;
set<pair<int,int> > ::iterator it;
pair<int,int> p;
int dirx[4] = {0,0,1,-1};
int diry[4] = {1,-1,0,0};
bool inside(int x,int y)
{
return x >= 0 &&x <= 8 && y >= 0 &&y <= 8;
}
int f;
void dfs(int x,int y)
{
vis[x][y] = 1;
for(int i = 0 ; i < 4 ; i++)
{
int dx = x + dirx[i];
int dy = y + diry[i];
if(inside(dx,dy))
{
if( ma[dx][dy] =='.')
{
se.insert(make_pair(dx,dy));
}
else if(ma[dx][dy] == 'o' && vis[dx][dy] ==0)
{
dfs(dx,dy);
}
}
}
}
void dfs1(int x,int y)
{
vis[x][y] = 1;
//if(x==8 &&y ==6) cout<<"********"<<endl;
se2.insert(make_pair(x,y));
for(int i = 0 ; i < 4 ; i++)
{
int dx = x + dirx[i];
int dy = y + diry[i];
if(inside(dx,dy))
{
// if(x== 8)
// cout<<dx <<dy <<endl;
if( ma[dx][dy] =='.')
{
f = 1;
}
else if(ma[dx][dy] == 'o' && vis[dx][dy] == 0)
{
dfs1(dx,dy);
}
}
}
}
void dfs2(int x,int y)
{
vis[x][y] = 1;
se2.insert(make_pair(x,y));
for(int i = 0 ; i < 4 ; i++)
{
int dx = x + dirx[i];
int dy = y + diry[i];
if(inside(dx,dy))
{
if( ma[dx][dy] =='.')
{
f = 1;
}
else if(ma[dx][dy] == 'x' && vis[dx][dy] ==0)
{
dfs2(dx,dy);
}
}
}
}
int main()
{
// se.insert(make_pair(1,1)); se.insert(make_pair(1,1));
//cout<<se.size()<<endl;
int t;
scanf("%d",&t);
int cas=1;
int cnt = 0;
while(t--)
{
cnt = 0;
for(int i = 0; i< 9; i++)
{
scanf("%s",ma[i]);
}
f= 0;
memset(vis,0,sizeof vis);
for(int i = 0; i <9; i++)
{
for(int j = 0 ; j < 9 ; j++)
{
if(ma[i][j] =='o' &&vis[i][j] == 0)
{
f = 0;
se2.clear();
dfs1(i,j);
if(f == 0)
{
for(it = se2.begin(); it!=se2.end(); it++)
{
p = *it;
ma[p.first][p.second] = '.';
}
}
}
}
}
memset(vis,0,sizeof vis);
for(int i = 0; i <9; i++)
{
for(int j = 0 ; j < 9 ; j++)
{
if(ma[i][j] =='x' && vis[i][j] ==0)
{
f = 0;
se2.clear();
dfs2(i,j);
if(f == 0)
{
for(it = se2.begin(); it!=se2.end(); it++)
{
p = *it;
ma[p.first][p.second] = '.';
}
}
}
}
}
f = 0;
//cout<<endl;
memset(vis,0,sizeof vis);
//for(int i = 0 ; i < 9; i++)
// cout<<ma[i]<<endl;
for(int i = 0; i <9&&!f; i++)
{
for(int j = 0 ; j < 9 &&!f; j++)
{
if(ma[i][j] =='o' && vis[i][j] ==0)
{
se.clear();
dfs(i,j);
if(se.size() == 1 )
f= 1;
}
}
}
if(f)printf("Case #%d: Can kill in one move!!!\n",cas++);
else printf("Case #%d: Can not kill in one move!!!\n",cas++);
}
return 0;
}