小白书上的图的例题.
LRJ介绍了两种方法, 一种是利用递归进行DFS, 这种写起来很方便, 但是提交上去提示
Runtime Error(STACK_OVERFLOW)
溢出了.可能是因为图太大, LRJ在书中也说了.
LRJ又说了一种方法, 用显示栈来代替递归... 想不出来. 路过的各位如果会的求指导╮(╯▽╰)╭
然后参考了雷掣的代码, 用的是BFS.
然后我就涨姿势了, 可以用make_pair来把一个坐标放入queue中.
果然应该多看别人的代码...
具体的思路和用DFS是一样的, 只是把递归调用改为加入队列即可.
不过虽然AC了, 时间效率惨不忍睹.... 等学成之后再来修改..
-----------------------------------------------------------------------------------------------------------
南京邮电的OJ上也有这题, 在那里用DFS不会溢出, 可能是数据弱吧....
详情见代码
#include <cstdio>
#include <cstring>
#include <queue>
using namespace std;
const int MAXN = 701;
queue<pair<int, int> > q;
int pic[MAXN][MAXN], vis[MAXN][MAXN];
void BFS(int x, int y);
int main()
{
//freopen("input.txt", "r", stdin);
int n;
int count = 0;
char s[1000];
scanf("%d%*c", &n);
memset(pic, 0, sizeof(pic)); //初始化所有的白格
memset(vis, 0, sizeof(vis)); //所有的格子都没被访问过.
for (int i = 0; i < n; i++)
{
scanf("%s%*c", s);
for (int j = 0; j < n; j++)
pic[i + 1][j + 1] = s[j] - '0'; //将图像往中间移
}
for (int i = 1; i <= n; i++)
{
for (int j = 1; j <= n; j++)
{
if (!vis[i][j] && pic[i][j])
{
count++;
BFS(i, j);
}
}
}
printf("%d\n", count);
return 0;
}
void BFS(int x, int y)
{
q.push(make_pair(x, y));
while (!q.empty())
{
pair<int, int> p;
p = q.front();
q.pop();
//printf("%d %d ", p.first, p.second);
x = p.first;
y = p.second;
if (pic[x][y] && !vis[x][y]) //如果是黑色且没被访问过
{
vis[x][y] = 1;
for (int i = x - 1; i <= x + 1; i++) //把身边的八个格子加入队列.本来应该去掉本身的, 懒得去了, 无差别
for (int j = y - 1; j <= y + 1; j++)
q.push(make_pair(i, j));
}
}
}