题目描述
给定一个迷宫maze,其中maze[i,j]表示第i行第j列的情况。”#”表示墙,”.”表示空地,”R”表示空地,且这里可以在初始时放置一个机器人。迷宫的四个边界都被墙环绕。
假设迷宫中放置了一些机器人。他们会按照相同的指令行走——指令有四种,分别令他们向上下左右其中一个方向行走一步。假设机器人接到了指令,如果指令规定的方向上的相邻格子是空地,那么他会行走一步,否则他会停留在原地。允许同一地点有多个机器人。每秒钟都会执行一条指令。
你的目标是让尽量多的机器人聚在同一格子中。你可以任意选择一些”R”的位置放入机器人,并且给出任意的指令,但你必须使得你放入的机器人最终走到同一格子中。请你求出,最多可以使多少机器人走到一起。
【样例说明】
两个位置不连通,因此如果放两个机器人,无论发出什么指令也不会走到一起。
输入格式
第一行两个整数n,m(1<=n,m<=50),表示迷宫大小。
接下来n行,每行m个字符,表示迷宫。
输出格式
一个整数,表示最多可以有多少机器人聚在一起。
rqnoj十月苦情赛。被吃了100分的题。
统计所有连通块里有多少个R。
用一个floodfill就完了。
有个叫Wjj的屁儿痛的用的floyd。wa90
//#include <iostream>
//using std::cout;
//using std::cin;
#include <cstdio>
const long oo = 0x7fff0000;
long n;long m;
char maze[52][52];
long dx[4] = {-1,0,1,0};
long dy[4] = {0,1,0,-1};
bool used[52][52];
long ans = 0;
void dfs(long p,long q)
{
if (maze[p][q]=='r'||maze[p][q]=='R')
{
ans++;
}
for (long i=0;i<4;i++)
{
long nx = p+dx[i];
long ny = q+dy[i];
if (maze[nx][ny]!='#'&&!used[nx][ny])
{
used[nx][ny]=true;
dfs(nx,ny);
}
}
}
int main()
{
// freopen(".in","r",stdin);
// freopen(".out","w",stdout);
scanf("%ld%ld",&n,&m);
for (long i=1;i<n+1;i++)
{
scanf("\n");
for (long j=1;j<m+1;j++)
{
scanf("%c",&maze[i][j]);
}
}
for (long i=0;i<n+1;i++)
{
maze[i][0]=maze[i][m+1]='#';
}
for (long i=0;i<m+1;i++)
{
maze[0][i]=maze[n+1][i]='#';
}
long out = 0;
for (long i=1;i<n+1;i++)
{
for (long j=1;j<m+1;j++)
{
if (maze[i][j]!='#'&&!used[i][j])
{
used[i][j] = true;
ans = 0;
dfs(i,j);
#ifdef symbol
for (long i=1;i<n+1;i++)
{
for (long j=1;j<m+1;j++)
{
printf("%c ",used[i][j]==1?'o':' ');
}
printf("\n");
}
#endif
out >?= ans;
}
}
}
printf("%ld",out);
return 0;
}