题目

源地址:

http://codeforces.com/problemset/problem/6/B

理解

总统的办公室里面坐着他的副手,然后每个人都会有一张办公桌(长短不一,但每个人都有自己的颜色)。然后告诉你每个人的办公桌都是长方形,给定一个描述办公室布局的图,要你求出这个办公室里面总统的副手有几个。 一开始我想得太多,觉得应该用DFS来暴力搜索,只要判断总统办公桌的四周即可。后来发现这种方法是不可行,决定采用STL里面的pair+set来做。思路很简单,既然已经告诉我办公桌都是长方形的,那么,我只要找到总统办公桌所占的区域,然后直接遍历这块区域外围的一圈即可。

代码


#define MAXN 100+10

char c,road[MAXN][MAXN];
int n,m;
pair<int,int> lt(-1,-1);
	pair<int,int> rb(-1,-1);
	set<char> ans;

 void init()
 {
     scanf("%d %d %c", &n,&m,&c);
     for(int i=0;i<n;i++)
     {
         scanf("%s", road[i]);
     }
 }

int main(int argc, char const *argv[])
{
	init();

	for(int i=0;i<n;i++)
    {
        for(int j=0;j<m;j++)
        {
            if(road[i][j]==c)
            {
                rb=pair<int,int>(i,j);
                if(lt.first<0)  lt=pair<int,int>(i,j);
            }
        }
    }
    for(int i=lt.first;i<=rb.first;i++)
    {
        for(int j=lt.second;j<=rb.second;j++)
        {
            if(i>0&&road[i-1][j]!=c&&road[i-1][j]!='.') ans.insert(road[i-1][j]);
            if(i<n-1&&road[i+1][j]!=c&&road[i+1][j]!='.')   ans.insert(road[i+1][j]);
            if(j>0&&road[i][j-1]!=c&&road[i][j-1]!='.') ans.insert(road[i][j-1]);
            if(j<m-1&&road[i][j+1]!=c&&road[i][j+1]!='.')   ans.insert(road[i][j+1]);
        }
    }
    printf("%d", ans.size());
    return 0;
}

更新日志

  • 2014年11月22日 已AC。