题目内容:
现有画有黑线(直线或曲线)的白底图片一张,计算出有多少条黑线、并依次输出每条黑线所占的点数。图片我们用0、1图表示,1代表黑点 0 代表白点,某点周围8个方向都算连通,如下图所示,共有3条黑线,长度分别是5、3、5:
1 0 0 0 0 0 0
0 1 1 1 1 0 0
0 0 0 0 0 0 0
1 1 0 0 0 1 1
1 0 0 1 1 1 0
输入描述
图的宽w、高h,换行输入图的像素点.(测试数据结果唯一确定)
输出描述
黑线条数、换行输出每条线长度.(条数及每个长度各占一行).
输入样例
7 5
1 0 0 0 0 0 0
0 1 1 1 1 0 0
0 0 0 0 0 0 0
1 1 0 0 0 1 1
1 0 0 1 1 1 0
输出样例
3
5
3
5
*/
//思路:广搜
#include <iostream> #include <queue> using namespace std; int a[100][100]; int n, m; typedef struct node{ int x; int y; }Node; int b[9][2] = {-1, -1, -1, 0, -1, 1, 0, -1, 0, 1, 1, -1, 1, 0, 1, 1}; int wf(int x, int y){ queue<Node> point; Node n1, n2, n3; if(a[x][y] == 0) return 0; int count = 0; int yy, xx; n1.x = x; n1.y = y; point.push(n1); while(point.empty() != 1){ n2 = point.front(); a[n2.x][n2.y] = 0; point.pop(); count++; for(int i = 0; i < 8; i++){ xx = n2.x + b[i][0]; yy = n2.y + b[i][1]; if(xx < n && xx >= 0 && yy < m && yy >= 0){ int temp = 0; temp = a[xx][yy]; if(a[xx][yy] == 1) { n3.x = xx; n3.y = yy; a[xx][yy] = 0; //必须清零,否则前一个广搜时会重复 point.push(n3); } } } } return count; } int main(){ int xian = 0; int b[100]; cin >> m >> n; for(int i = 0; i < n; i++) for(int j = 0; j < m; j++) cin >> a[i][j]; for(int i = 0; i < n; i++){ for(int j = 0; j < m; j++){ if(a[i][j] == 1){ int t = wf(i, j); b[xian++] = t; } } } cout << xian << endl; for(int i = 0; i < xian; i++){ cout << b[i] << endl; } return 0; }