【洛谷】P1506 拯救oibh总部

题目背景

oibh总部突然被水淹没了!现在需要你的救援……
题目描述

oibh被突来的洪水淹没了>.<还好oibh总部有在某些重要的地方起一些围墙,用*号表示,而一个封闭的*号区域洪水是进不去的……现在给出oibh的围墙建设图,问oibh总部没被淹到的重要区域(由"0"表示)有多少。
输入格式

第一行是两个数,x和y(x,y<=500)

第二行及以下是一个由*和0组成的x*y的图。
输出格式

输出没被水淹没的oibh总部的“0”的数量。
输入输出样例

输入 #1
样例输入1
4 5
00000
00*00
0*0*0
00*00

样例输入2
5 5
*****
*0*0*
**0**
*0*0*
*****

输出 #1
样例输出1
1

样例输出2
5

 

#include<iostream>
using namespace std;
const int MAXN = 500 + 10;
int n, m, ans;
int map[MAXN][MAXN];
int dx[] = {0, 1, -1, 0, 0};
int dy[] = {0, 0, 0, -1, 1};
void search(int x, int y)
{
map[x][y] = 1;                    //被淹没了 ,标为 1 
for(int i = 1; i <= 4; i++)        //往四个方向搜 

{
int nx = x + dx[i];
int ny = x + dy[i];
if(map[nx][ny] == 0 && nx > 0 && nx <= n && ny > 0 && ny <= m)
{
search(nx, ny);
}
}
}
int main()
{
char e;
cin >> n >> m;
for(int i = 1; i <= n; i++)                //输入 

{
for(int j = 1; j <= m; j++)
{
cin >> e;
if(e == '*')                    //如果是墙,标为 1 

{
map[i][j] = 1;
}
else
{
map[i][j] = 0;                //其他标为 0 

}
}
}
for(int i = 1; i <= n; i++)                //因为谁是从外部淹没,所以从最外层开始搜索 

{
if(map[i][1] == 0)                    //搜索第一列 

{
search(i, 1);
}
if(map[i][m] == 0)                    //搜索最后一列 

{
search(i, m);
}
}
for(int i = 1; i <= m; i++)
{
if(map[1][i] == 0)                    //搜索第一行 

{
search(1, i);
}
if(map[n][i] == 0)                    //搜索最后一行 

{
search(n, i);
}
}
for(int i = 1; i <= n; i++)                //因为被淹没的都与最外层的 0 相连 

{                                        //所以没有被淹没的都被墙堵住了 
for(int j = 1; j <= m; j++)            //搜索剩余的 0 

{
if(map[i][j] == 0)
{
ans++;
}
}
}
/*    for(int i = 1; i <= n; i++)                //测试哪些被淹没
{
for(int j = 1; j <= m; j++)
{
cout << map[i][j];
}
cout << endl;
}
*/
cout << ans << endl;
return 0;
} 

不知道哪里错了,在测试的过程中,样例一 一直过不了。

使用上面测试代码测试后,样例一第二层的 0 还在,应该是递归的某个地方出了问题,可是检查怎么也不知道是哪里错了

救救我!!!

回答

递归中的

int ny = x + dy[i];

改为:

int ny = y + dy[i];

以上是【洛谷】P1506 拯救oibh总部的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>