Description
暑假就要开始啦!小伙伴们又可以肆无忌惮的开黑吃鸡了喵!我们知道开黑吃鸡最重要的当然是团队合作了。在一个地图中,一个小队的玩家之间的距离不能太远,这样当队友遇到危险被击倒时才能保证有队友可以在足够的时间内赶过去。现在,我们有一个N*N的地图,其中“#”表示无法跨越的障碍物,其余符号均可通过,大写字母“A”-“Z”表示小队编号,队员在每个单位时间内只能上下左右移动一格(每个小队最多有4个人)。在一个小队中,如果当其中有一人被击倒,有至少一个队友可以在规定时间T内赶过去,那么我们认为这个小队是一个配合出色的小队。问题来了:在给定的地图中,有多少小队是配合出色的呢?(规定一个人的小队不是配合出色的)
Input
第1行,整数N(1≤N≤30),整数T(1≤T≤10)
第2~N+1行 输入N*N的地图。
Output
输出配合出色小队个数
Sample Input
8 3
……..
….A…
……B.
……..
..B..B..
……..
..C…C.
……..
Sample Output
1
HINT
在样例中,共有A、B、C三个队伍,其中只有B小队的每个队员可以在三个单位时间内得到队友的救援。
注意:题目要保证这个出色的小队中,每个人都可以在t时间内被救。
AC代码:
#include<bits/stdc++.h>
#define rep(i,s,e) for(int i=s;i<=e;i++)
#define rev(i,s,e) for(int i=e;i>=s;i--)
using namespace std;
const int maxn = 105;
int dir[4][2] = {1,0,-1,0,0,1,0,-1};
char mmap[maxn][maxn];
bool vis[maxn][maxn];
int ans[maxn];
struct point{
int x,y,step;
};
int t,n;
bool check(int x,int y)
{
if(x>=0 && x<n && y>=0 && y<n && !vis[x][y]) return true;
else return false;
}
int bfs(int x,int y)
{
memset(vis,false,sizeof(vis));
queue<point> q;
point tmp,ne,st;
vis[x][y] = true;
st.x = x;
st.y = y;
st.step = 0;
q.push(st);
int flag = 0;
while(!q.empty())
{
tmp = q.front();
q.pop();
if(tmp.step>=t)
break;
for(int i=0;i<4;i++)
{
ne.x = tmp.x+dir[i][0];
ne.y = tmp.y+dir[i][1];
if(check(ne.x,ne.y) && mmap[ne.x][ne.y]!='#')
{
vis[ne.x][ne.y] = true;
ne.step = tmp.step+1;
q.push(ne);
if(mmap[ne.x][ne.y] == mmap[st.x][st.y]) flag = 1;
}
}
}
return flag;
}
int main()
{
#ifdef LOCAL_FILE
freopen("in.txt","r",stdin);
#endif // LOCAL_FILE
cin>>n>>t;
rep(i,0,n-1){
rep(j,0,n-1){
cin>>mmap[i][j];
}
}
rep(i,0,n-1){
rep(j,0,n-1){
if(mmap[i][j]>='A' && mmap[i][j]<='Z')
{
if(bfs(i,j)) ans[mmap[i][j]-'A']++;
else ans[mmap[i][j]-'A'] = 0;
}
}
}
int res = 0;
rep(i,0,26)
{
if(ans[i]>1) res++;
}
cout<<res<<endl;
return 0;
}