经理办公室 | ||||||
| ||||||
Description | ||||||
经理有一个非常大的办公室,办公室里还有一些副经理和一些其他下级,在办公室每个人都有一个独特颜色的办公桌,桌子是矩形的并且每一条边与办公室的墙平行。一天,经理想给副经理们召开集会,很不幸,他不能准确的记得有多少个副经理,但是经理知道副经理的桌子与自己的桌子是贴着的,也就是说,经理与副经理的桌子是有一部分公共边的。
这个大办公室可以看成一个n*m的矩形,用一个大写字母代表桌子的颜色。不同字母代表不同人的桌子颜色,连续出现的相同字母的个数表示该人桌子的大小(表示桌子边长为字符个数单位长度),字符“.”表示这个位置没有人。
| ||||||
Input | ||||||
多组数据,第一行三个空格隔开的整数n,m和c,1≤n,m≤100 代表办公室的长和宽,C代表经理桌子的颜色。下面n行每行m个字符——对办公室的描述,输入确保每一个桌子的颜色是独一无二的,颜色用大写字母表示。 | ||||||
Output | ||||||
输出一个整数,这个办公室副经理的个数。 | ||||||
Sample Input | ||||||
3 4 R
G.B.
.RR.
TTT.
3 3 Z
...
.H.
..Z
| ||||||
Sample Output | ||||||
2
0
| ||||||
Source | ||||||
2014暑假集训练习赛(8月6日) |
很水很水很水的一道题。。。。数据也是很水很水、、、、
这里思路很简单明了:找到经理的桌子,遍历他的桌子的一周,(四个点)看看有没有其他颜色的桌子,如果有的话,对颜色进行标记、并且output++;
注意点图的大小,完事注意点地图的非法访问问题就行了、
#include<stdio.h>
#include<string.h>
using namespace std;
char a[2];
int n,m;
char map[500][500];
int vis[500][500];
int fx[4]={0,0,1,-1};
int fy[4]={1,-1,0,0};
int color[26];
int output;
void dfs(int x,int y)
{
// printf("%d %d\n",x,y);
vis[x][y]=1;
for(int i=0;i<4;i++)
{
int xx=x+fx[i];
int yy=y+fy[i];
if(xx>=0&&xx<n&&yy>=0&&yy<m&&vis[xx][yy]==0)
{
if(map[xx][yy]>='A'&&map[xx][yy]<='Z'&&map[xx][yy]!=a[0])
{
if(color[map[xx][yy]-'A']==0)
{
output++;
color[map[xx][yy]-'A']=1;
}
}
}
}
return ;
}
int main()
{
while(~scanf("%d%d%s",&n,&m,a))
{
memset(color,0,sizeof(color));
memset(vis,0,sizeof(vis));
for(int i=0;i<n;i++)
{
scanf("%s",map[i]);
}
output=0;
for(int i=0;i<n;i++)
{
for(int j=0;j<m;j++)
{
if(map[i][j]==a[0])
{
dfs(i,j);
}
}
}
printf("%d\n",output);
}
}