问题 E: 细胞
时间限制: 1 Sec 内存限制: 128 MB
题目描述
一矩形阵列由数字0到9组成,数字1到9为细胞数字,若沿细胞数字上下左右还是细胞数字则为同一细胞,求给定矩形阵列的细胞个数。
例如,
0234500067
1034560500
2045600671
0000000089,有4个细胞(细胞为加粗体区域)。
输入
第一行是一个测试数据的个数T,表示将会有T组测试数据。
每组测试数据的第一行:两个数字M N (1<=M<=50 1<=N<80)表示该阵列有M行N列。
从第2行到第M+1行每行有连续的N个字符。
输出
与测试数据对应,刚好有T行,每行输出对应测试数据的细胞个数。
样例输入
1
4 10
0234500067
1034560500
2045600671
0000000089
样例输出
4
做的时候非常吃力!做完之后回首一看——还是好难!
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int map[90][90];
int vis[90][90];
void reset_map(int incmaxx,int incmaxy)
{
memset(map,0,sizeof(int)*90*90);
memset(vis,0,sizeof(int)*90*90);
int i;
for(i=0;i<incmaxx+2;i++)
{
vis[i][0]=1;
vis[i][incmaxy+1]=1;
}
for(i=0;i<incmaxy+2;i++)
{
vis[0][i]=1;
vis[incmaxx+1][i]=1;
}
}
void dfs(int x,int y)
{
if(map[x][y]==0||vis[x][y]==1) return;
vis[x][y]=1;
dfs(x-1,y);
dfs(x+1,y);
dfs(x,y-1);
dfs(x,y+1);
}
void deal(int incmaxx,int incmaxy)
{
int i,j;
int count=0;
for(i=1;i<incmaxx+1;i++)
{
for(j=1;j<incmaxy+1;j++)
{
if(map[i][j]==1&&vis[i][j]==0)
{
count++;
dfs(i,j);
}
}
}
printf("%d\n",count);
}
char buff[128];
int main()
{
int all,maxx,maxy,i,j;
#ifndef __GNUC__
freopen("D:\\std.txt","r",stdin);
#endif
scanf("%d",&all);
for(;all>0;all--)
{
scanf("%d %d%*c",&maxx,&maxy);
reset_map(maxx,maxy);
for(i=0;i<maxx;i++)
{
memset(buff,0,128);
gets(buff);
for(j=0;j<maxy;j++)
{
if(buff[j]=='0')
{
map[i+1][j+1]=0;
}
else
{
map[i+1][j+1]=1;
}
}
}
deal(maxx,maxy);
}
return 0;
}
中间条件编译是用来在本机上测试然后无需修改直接提交w(懒死)