线数目
题目内容:
现有画有黑线(直线或曲线)的白底图片一张,计算出有多少条黑线、并依次输出每条黑线所占的点数。图片我们用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
近乎BFS裸题
#include<iostream>
#include<string>
#include<string.h>
#include<vector>
#include<cstdio>
#include<set>
#include<stack>
#include<queue>
#include<algorithm>
#include<list>
using namespace std;
typedef long long ll;
int n, m;
int map[1000][1000];
bool vis[1000][1000];
int sum;
int t[8][2] = { {1, 0}, {-1, 0}, {0, 1}, {0, -1}, {-1, -1}, {-1, 1}, {1, -1}, {1, 1} };
typedef pair<int, int> P;
int bfs(int a, int b)
{
vis[a][b] = true;
queue<P> q;
q.push(P(a, b));
int len = 0;
while (q.size())
{
P p = q.front();
q.pop();
len++;
for (int i = 0; i < 8; i++)
{
int na = p.first + t[i][0];
int nb = p.second + t[i][1];
if (na >= 0 && na < n && nb >= 0 && nb < m && map[na][nb] && !vis[na][nb])
{
q.push(P(na, nb));
vis[na][nb] = true;
}
}
}
return len;
}
int main()
{
cin >> m >> n;
for (int i = 0; i < n; i++)
for (int j = 0; j < m; j++)
cin >> map[i][j];
queue<int> q;
for (int i = 0; i < n; i++)
{
for (int j = 0; j < m; j++)
{
if (map[i][j] && !vis[i][j])
{
q.push(bfs(i, j));
sum++;
}
}
}
cout << sum << endl;
while (q.size())
{
cout << q.front() << endl;
q.pop();
}
}