90分第一个样例 过不去 但第一个样例答案应该是Bad placement.
  • 板块P1331 海战
  • 楼主CBTT
  • 当前回复0
  • 已保存回复0
  • 发布时间2024/4/7 13:32
  • 上次更新2024/4/7 17:42:39
查看原帖
90分第一个样例 过不去 但第一个样例答案应该是Bad placement.
732729
CBTT楼主2024/4/7 13:32

第一个样例过不去,我尝试 直接输出 Bad placement. 第一个样例就过了 实在找不到逻辑问题了 求大佬帮忙看看有什么问题

#include <iostream>
#include <cstring>
#include <queue>

using namespace  std;

const int N = 1005;

int n, m;
string grid[N];
bool st[N][N];
int res;
int maxi, maxj;
int md[][4] = { {0,1,0,-1},{1,0,-1,0} };

void bfs(int a, int b)
{
	st[a][b] = true;
	queue<pair<int, int>> mq;
	mq.push({ a,b });
	maxi = max(maxi, a);
	maxj = max(maxj, b);
	while (mq.size())
	{
		auto t = mq.front();
		mq.pop();
		for (int i = 0; i < 4; i++)
		{
			int j = t.first + md[0][i];
			int k = t.second + md[1][i];
			if (j >= 0 && j < n && k >= 0 && k < m)
			{
				if (st[j][k] == false && grid[j][k] == '#')
				{
					st[j][k] = true;
					mq.push({ j,k });
					maxi = max(maxi, j);
					maxj = max(maxj, k);
				}
			}


		}
	}
}

bool check(int x, int y, int a, int b)
{
	for (int i = x; i <= a; i++)
		for (int j = y; j <= b; j++)
			if (grid[i][j] == '.')return true;
	return  false;
}


int main()
{
	cin >> n >> m;

	for (int i = 0; i < n; i++)
	{
		string s;
		cin >> grid[i];
	}

	for (int i = 0; i < n; i++)
		for (int j = 0; j < m; j++)
		{
			if (st[i][j] == false && grid[i][j] == '#')
			{
				maxi = maxj = 0;
				res++;
				bfs(i, j);
				if (check(i, j, maxi, maxj))
				{
					cout << "Bad placement." << endl;
					return 0;
				}
			}
		}
	cout << "There are " << res << " ships." << endl;

}

2024/4/7 13:32
加载中...