NC214844. 图像存储
描述
输入描述
多组输入,最多不超过1000组
首行输入2个整数 n , m()代表图像的尺寸。
接下来输入一个n行m列的01矩阵(0和1之间无空格间隔)以一行中两个0结束输入n*m的和小于1e7
输出描述
对于每组输入在一行中输出给定图像中黑块的个数和不同的黑块的种数。
示例1
输入:
6 6 001100 001001 000011 101000 000110 000100 5 6 111101 100100 100101 100100 111101 0 0
输出:
5 3 4 2
C++ 解法, 执行用时: 159ms, 内存消耗: 1524K, 提交时间: 2022-06-07 16:51:16
#include<bits/stdc++.h> using namespace std; const int dx[]={-1,0,1,0}; const int dy[]={0,1,0,-1}; bool b[1010][1010]; int n,m,cnt,ans; map<unsigned long long,bool> c; unsigned long long has; char st[1010][1010]; void dfs(int x,int y) { if(x<1||x>n||y<1||y>m||b[x][y]||st[x][y]=='0') return; b[x][y]=1; for(int i=0;i<4;i++) { int xx=x+dx[i]; int yy=y+dy[i]; dfs(xx,yy); has=has*131+i; } } int main() { while(~scanf("%d%d",&n,&m)) { if(n==0&&m==0) break; cnt=0;ans=0; memset(b,0,sizeof(b)); c.clear(); for(int i=1;i<=n;i++) scanf("%s",st[i]+1); for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) if(!b[i][j]&&st[i][j]=='1') { has=0; cnt++; dfs(i,j); if(!c[has]) { c[has]=1; ans++; } } printf("%d %d\n",cnt,ans); } return 0; }