前言:
晚上有点困了,本来是看吉吉是第一个的,然后其实是司机,然后打错一些东西...不过也没很久就搞好了..说明还行.
思路:
本题思路十分简单,就算搜每个连通块大小,然后判断下吉吉的和司机的连通块数量就好了.
代码:
代码有点丑,将就一下~
#include <bits/stdc++.h>
using namespace std;
const int N=105,M=5;
char jj[M][N];
char sj[M][N];
bool visa[M][N];//jj
bool visb[M][N];//sj
vector<int>a;//统计下每个连通块a的数量
vector<int>b;//统计下每个连通块b的数量
int dx[8]={1,-1,0,0,1,-1,1,-1};
int dy[8]={0,0,1,-1,1,-1,-1,1};
int n=4,m;
int _dsu(int x,int y)
{
int res=0;
if(x<1||x>n||y<1||y>m||visa[x][y]||jj[x][y]=='.') return res;
visa[x][y]=true;
if(jj[x][y]=='*') res++;
for(int i=0;i<8;i++)
{
int nx=x+dx[i];
int ny=y+dy[i];
res+=_dsu(nx,ny);
}return res;
}
int __dsu(int x,int y)
{
int res=0;
if(x<1||x>n||y<1||y>m||visb[x][y]||sj[x][y]=='.') return res;
visb[x][y]=true;
if(sj[x][y]=='*') res++;
for(int i=0;i<8;i++)
{
int nx=x+dx[i];
int ny=y+dy[i];
res+=__dsu(nx,ny);
}return res;
}
//不会传数组(抱歉.
int main()
{
scanf("%d",&m);
for(int i=1;i<=n;i++)
{
scanf("%s",jj[i]+1);
}
for(int i=1;i<=n;i++)
{
scanf("%s",sj[i]+1);
}
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
if(!visa[i][j]&&jj[i][j]=='*')
{
a.push_back(_dsu(i,j));
}
}
}
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
if(!visb[i][j]&&sj[i][j]=='*')
{
b.push_back(__dsu(i,j));
}
}
}
sort(b.begin(),b.end());int numa=a.size();
int numb=b.size();
//cout<<numa<<' '<<numb<<endl;
if(numa>numb) puts("-1");
else
{
int ans=0;
for(int i=numa-1;i<numb;i++)
{
ans+=b[i];
}printf("%d\n",ans);
}
return 0;
}
京公网安备 11010502036488号