1117. 【宽度优先搜索BFS】面积
题目描述
编程计算由“*”号围成的下列图形的面积。面积计算方法是统计*号所围成的闭合曲线中水平线和垂直线交点的数目。如下图所示,在10*10的二维数组中,有“*”围住了15个点,因此面积为15。
输入
从文件 area.in 中读入数据。
如上
输出
输出到文件 area.out 中。
如上
样例输入 复制
0 0 0 0 0 0 0 0 0 0
0 0 0 0 1 1 1 0 0 0
0 0 0 0 1 0 0 1 0 0
0 0 0 0 0 1 0 0 1 0
0 0 1 0 0 0 1 0 1 0
0 1 0 1 0 1 0 0 1 0
0 1 0 0 1 1 0 1 1 0
0 0 1 0 0 0 0 1 0 0
0 0 0 1 1 1 1 1 0 0
0 0 0 0 0 0 0 0 0 0
样例输出 复制
15
#include <cstdio>
using namespace std;
int ans, a[17][17];
int h, t, q[10007][2];
int dx[4] = {0, 0, 1, -1}, dy[4] = {1, -1, 0, 0};
int main()
{
// freopen ("area.in", "r", stdin);
// freopen ("area.out", "w", stdout);
for (int i = 1; i <= 10; i++)
{
for (int j = 1; j <= 10; j++)
scanf ("%d", &a[i][j]);
}
for (int i = 0; i <= 11; i++)
{
for (int j = 0; j <= 11; j++)
{
if (a[i][j] == 0)
a[i][j] = 2;
}
}
for (int i = 0; i <= 11; i++)
{
for (int j = 0; j <= 11; j++)
{
h = 0, t = 1;
q[t][0] = i;
q[t][1] = j;
while (h < t)
{
h++;
int x = q[h][0];
int y = q[h][1];
for (int k = 0; k < 4; k++)
{
int xx = x + dx[k];
int yy = y + dy[k];
if (xx >= 0 && xx <= 11 && yy >= 0 && yy <= 11 && a[xx][yy] == 2)
{
t++;
q[t][0] = xx;
q[t][1] = yy;
a[xx][yy] = 0;
}
}
}
}
}
for (int i = 1; i <= 10; i++)
{
for (int j = 1; j <= 10; j++)
{
if (a[i][j] == 2)
ans++;
}
}
printf ("%d", ans);
return 0;
}
又不会了,代码到底哪有问题,大佬请赐教!