【洛谷】P1506 拯救oibh总部

#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];