go_alltheway 2021-03-30 17:51 采纳率: 0%
浏览 77

【洛谷】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;
} 

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

  • 写回答

4条回答 默认 最新

  • CSDN专家-cpp_learner 2021-04-01 13:28
    关注

    嗯。。你这个问题我调试过了,问题就出在递归哪里,具体要怎么该我暂且还没有想到。只能告诉你具体出现问题的地方。

    我将递归的全部坐标多打印出来,发现没有还差两个坐标,导致那两个坐标没有赋值1.

    我觉得有可能是你dx和dy的问题。

    评论

报告相同问题?