#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <string>
#include <cstring>
using namespace std;
//本题显然是一个求连通分量数的一个题目,关键是如何处理字母所对应的图像,这里采用点对*3的矩阵
const static int M = 455;
//const static int MM = 55;
int map[M][M];
int ans = 0;
int n,m;
int dist[4][2]={-1,0,0,-1,1,0,0,1};
void deal(int x,int y)//初始化以(x,y)为左上角的*3矩阵
{
for(int i=x;i<x+3;i++)
for(int j=y;j<y+3;j++)
map[i][j]=0;
map[x+1][y+1]=1;
return ;
}
void pre_map(int x,int y,char ch)//根据字母调节以(x,y)为左上角的*3矩阵,对应图片中有则用标志
{
deal(x,y);
switch(ch)
{
case 'A':map[x+1][y]=1;map[x][y+1]=1;break;
case 'B':map[x][y+1]=1;map[x+1][y+2]=1;break;
case 'C':map[x+1][y]=1;map[x+2][y+1]=1;break;
case 'D':map[x+1][y+2]=1;map[x+2][y+1]=1;break;
case 'E':map[x][y+1]=1;map[x+2][y+1]=1;break;
case 'F':map[x+1][y]=1;map[x+1][y+2]=2;break;
case 'G':map[x+1][y]=1;map[x][y+1]=1;map[x+1][y+2]=1;break;
case 'H':map[x+1][y]=1;map[x][y+1]=1;map[x+2][y+1]=1;break;
case 'I':map[x+2][y+1]=1;map[x+1][y]=1;map[x+1][y+2]=2;break;;
case 'J':map[x+1][y+2]=1;map[x][y+1]=1;map[x+2][y+1]=1;break;
case 'K':map[x][y+1]=1;map[x+2][y+1]=1;map[x+1][y]=1;map[x+1][y+2]=2;break;
}
return ;
}
void init_map()//初始化图像
{
for(int i=0;i<n*3;i+=3)
{ for(int j=0;j<3*m;j+=3)
{
char ch;
cin>>ch;
pre_map(i,j,ch);
}
getchar();
}
}
void print()//为验证图像是否正确的一个函数
{
for(int i=0;i<3*n;i++)
{
for(int j=0;j<3*m;j++)
{
if(map[i][j]==0) cout<<"0";
else cout<<"*";
}
cout<<endl;
}
}
void dfs(int x,int y)//求某点的连通分量,并全部标记为
{
if(map[x][y]==0) return ;
else
{
map[x][y]=0;
for(int i=0;i<4;i++)
{
int a=x+dist[i][0];
int b=y+dist[i][1];
if(a>=0&&b>=0&&a<3*n&&b<3*m)
dfs(a,b);
}
}
}
bool init()//主操作函数
{
cin>>n>>m;
if(n==-1&&m==-1)
return false;
init_map();
//print();
ans = 0;
for(int i=0;i<3*n;i++)
for(int j=0;j<3*m;j++)
if(map[i][j]==1) {ans++;dfs(i,j);}
cout<<ans<<endl;
return true;
}
int main()
{
while(init());
return 0;
}
hdu 1198
最新推荐文章于 2017-09-06 15:59:59 发布
