简单的图遍历问题,我一开始用dfs,结果750*750的数据就爆栈空间了,改用bfs就AC了。
#include <iostream>
#include <cstring>
#include <queue>
using namespace std;
int w, h, d[855][855], vis[855][855], ans;
void deal(int x, int y, queue<int> & q)//判断是否合法,是否访问过,然后压进队列中
{
if (x < h && x >= 0 && y < w && y >= 0 && d[x][y] && !vis[x][y])
{
vis[x][y] = 1;
q.push(x*w+y);
}
}
int main()
{
int i, j, tmax = -1;
string s;
cin >> w >> h;
for (i = 0; i < h; ++ i)
{
cin >> s;
for (j = 0; j < s.size(); ++ j ) if (s[j] == '.') d[i][j] = 1;//建01图
}
for (i = 0; i < h; ++ i)
for (j = 0; j < w; ++ j) if (!vis[i][j] && d[i][j])
{
ans = 0;
queue<int> q;
q.push(i*w+j);
vis[i][j] = 1;//第一个点要注意vis数组的操作
while (!q.empty())
{
int t = q.front();
q.pop();
int x = t / w;
int y = t % w;
++ ans;
deal(x+1, y, q);
deal(x, y+1, q);
deal(x-1, y, q);
deal(x, y-1, q);
deal(x+1, y+1, q);
deal(x+1, y-1, q);
deal(x-1, y+1, q);
deal(x-1, y-1, q);
}
if ( ans > tmax ) tmax = ans;
}
cout << tmax << endl;
return 0;
}