#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;
}
不知道哪里错了,在测试的过程中,样例一 一直过不了,救救我
嗯。。你这个问题我调试过了,问题就出在递归哪里,具体要怎么该我暂且还没有想到。只能告诉你具体出现问题的地方。
我将递归的全部坐标多打印出来,发现没有还差两个坐标,导致那两个坐标没有赋值1.
我觉得有可能是你dx和dy的问题。
现在回头看一看,感觉除了递归的问题外,还有就是你那种调用递归的写法的问题,只是将外层四边处理了而已,那里面的呢?所以这就是问题的根本。
您好,我是有问必答小助手,你的问题已经有小伙伴为您解答了问题,您看下是否解决了您的问题,可以追评进行沟通哦~
如果有您比较满意的答案 / 帮您提供解决思路的答案,可以点击【采纳】按钮,给回答的小伙伴一些鼓励哦~~
ps:问答VIP仅需29元,即可享受5次/月 有问必答服务,了解详情>>>https://vip.csdn.net/askvip?utm_source=1146287632
找到问题的原因了,第16行代码,应改为
int ny = y + dy[i];