3273: 吃鸡之团队合作
题目描述
暑假就要开始啦!小伙伴们又可以肆无忌惮的开黑吃鸡了喵!我们知道开黑吃鸡最重要的当然是团队合作了。在一个地图中,一个小队的玩家之间的距离不能太远,这样当队友遇到危险被击倒时才能保证有队友可以在足够的时间内赶过去。现在,我们有一个N*N的地图,其中“#”表示无法跨越的障碍物,其余符号均可通过,大写字母“A”-“Z”表示小队编号,队员在每个单位时间内只能上下左右移动一格(每个小队最多有4个人)。在一个小队中,如果当其中有一人被击倒,有至少一个队友可以在规定时间T内赶过去,那么我们认为这个小队是一个配合出色的小队。问题来了:在给定的地图中,有多少小队是配合出色的呢?(规定一个人的小队不是配合出色的)
输入
第1行,整数N(1≤N≤30),整数T(1≤T≤10)
第2~N+1行 输入N*N的地图。
输出
输出配合出色小队个数
样例输入
8 3 ........ ....A... ......B. ........ ..B..B.. ........ ..C...C. ........
样例输出
1
//找到不符合要求的++
//最后- ++
#include<iostream>
#include<cstdio>
#include<cstdlib>
int n,m;
char ch[99][99];
bool f=false;
int f1[99]={0}; //很重要的标记 一个小队如果有一个不符合要求 这一队就out 不用重复计算
int f2[99][99]={0}; //标记地图走过的痕迹
int f3[99]={0}; //标记字母有几种 就是有几个吃鸡小队
int dx[4]={0,1,0,-1};
int dy[4]={1,0,-1,0};
using namespace std;
void dfs(int x,int y,char str,int t)
{
if(t<=0)
{
return ;
}
for(int i=0;i<4;i++)
{
int nx=x+dx[i];
int ny=y+dy[i];
if(nx>=0&&nx<n&&ny>=0&&ny<n&&ch[nx][ny]!='#'&&f2[nx][ny]==0)
{
if(ch[nx][ny]==str)
{
f=true;
return ;
}
f2[nx][ny]=1;
dfs(nx,ny,str,t-1);
f2[nx][ny]=0;
}
}
}
int main()
{
int i,j,k;
int sum=0,num=0;
scanf("%d %d",&n,&m);
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
cin>>ch[i][j];
}
}
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
if(ch[i][j]<='Z'&&ch[i][j]>='A')
{
if(f3[ch[i][j]-'A']==0)
{
num++;
f3[ch[i][j]-'A']=1;
}
f2[i][j]=1;
dfs(i,j,ch[i][j],m);
f2[i][j]=0;
if(f==false)
{
if(f1[ch[i][j]-'A']==0)
{
sum++;
f1[ch[i][j]-'A']=1;
}
}
else
{
f=false;
}
}
}
}
k=num-sum;
cout<<k<<'\n';
return 0;
}