【codevs 1293】送给圣诞夜的极光

来源:互联网 发布:淘宝怎么好评改差评 编辑:程序博客网 时间:2024/05/18 02:12

1293 送给圣诞夜的极光
时间限制: 1 s
空间限制: 128000 KB
题目等级 : 黄金 Gold
题解
题目描述 Description
圣诞老人回到了北极圣诞区,已经快到12点了。也就是说极光表演要开始了。这里的极光不是极地特有的自然极光景象。而是圣诞老人主持的人造极光。
  轰隆隆……烟花响起(来自中国的浏阳花炮之乡)。接下来就是极光表演了。
  人造极光其实就是空中的一幅幅n*m的点阵图像。只是因为特别明亮而吸引了很多很多小精灵的目光,也成为了圣诞夜最美丽的一刻。
  然而在每幅n*m的点阵图像中,每一个点只有发光和不发光两种状态。对于所有的发光的点,在空中就形成了美丽的图画。而这个图画是以若干个(s个)图案组成的。对于图案,圣诞老人有着严格的定义:对于两个发光的点,如果他们的曼哈顿距离(对于A(x1,y1)和B(x2,y2),A和B之间的曼哈顿距离为|x1-x2|+|y1-y2|)小于等于2。那么这两个点就属于一个图案……
  小精灵们一边欣赏着极光,一边数着每一幅极光图像中的图案数。伴着歌声和舞蹈,度过了美丽的圣诞之夜。^_^

输入描述 Input Description
第一行,两个数n和m。(1<=n,m<=100)
接下来一共n行,每行m个字符。对于第i行第j个字符,如果其为“-”,那么表示该点不发光,如果其为“#”,那么表示该点发光。不可能出现其他的字符。

输出描述 Output Description
第一行,一个数s。

样例输入 Sample Input
19 48


—####—–#—–#———————-####—

–######—-#—–#———————######–

-########–#-#—#-#####–#-##-##—#–########-

-###–###–#-#—#-#—-#-##-##–#–#–###–###-

-###–###–#–#-#–######-#–#—#-#—###–###-

-########–#–#-#–#——#–#—-##—########-

–######—#—#—######-#–#—–#—-######–

—####—————————-#—–####—

———————————-#————-


—###–#——–#——#———————–

–#—#-#—————#———————–

-#——#-##–#-##–##-###-#-##-###–###-#–##–

-#——##–#-##-#-#—-#–##–#—##—##-#—-

-#——#—#-#–#–#—#–#—#—##—-#–#—

–#—#-#—#-#–#—#–#–#—#—##—##—#–

—###–#—#-#–#-##—#–#—#—#-###-#-##—


样例输出 Sample Output
4

数据范围及提示 Data Size & Hint

嗯 搜索
按照题目要求搜连通块

#include <iostream>#include <cstdio>#include <cstring>#include <algorithm>#include <queue>using namespace std;int dx[] = {1,0,-1,0,1,1,-1,-1,2,0,-2,0};int dy[] = {0,1,0,-1,1,-1,1,-1,0,2,0,-2};const int MAXN = 105;int n,m,maps[MAXN][MAXN];int ans = 0;bool use[MAXN][MAXN];char s;struct edge{    int x,y;};bool out(int x,int y){    if(x < 1 || x > n || y < 1 || y > m)    return false;    else    return true;}queue < edge > q;void work(int x,int y,int k){    while(!q.empty())   q.pop();    q.push((edge){x,y});    use[x][y] = true;    maps[x][y] = 0;    while(!q.empty())    {        edge u = q.front();        q.pop();        use[u.x][u.y] = true;        maps[u.x][u.y] = 0;        for(int i = 0; i < 12; i ++)        {            int tx = u.x + dx[i];            int ty = u.y + dy[i];            if(!out(tx,ty)) continue;            if(use[tx][ty] > 0) continue;            if(maps[tx][ty] != 2)            {                maps[tx][ty] = 0;                continue;            }               use[tx][ty] = true;            maps[tx][ty] = 0;            q.push((edge){tx,ty});        }    }    return;}int main(){    memset(use,0,sizeof(use));    memset(maps,0,sizeof(maps));    scanf("%d %d",&n,&m);    for(int i = 1; i <= n; i ++)        for(int j = 1; j <= m; j ++)        {            cin >> s;            if(s == '#')    maps[i][j] = 2;            else if(s == '-')   maps[i][j] = 1,use[i][j] = true;            else    cin >> s;        }    int k = 0;    for(int i = 1; i <= n; i ++)        for(int j = 1; j <= m;j ++)            if(!use[i][j])  work(i,j,k ++);    ans = k;    printf("%d\n",ans);    return 0;}
0 0