hdu 1198

来源:互联网 发布:网络推广sem 编辑:程序博客网 时间:2024/04/30 16:51
#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;}

原创粉丝点击