求助大佬为什么第十个点会出re
  • 板块P1331 海战
  • 楼主m泛函625
  • 当前回复6
  • 已保存回复6
  • 发布时间2021/1/29 19:31
  • 上次更新2023/11/5 04:11:23
查看原帖
求助大佬为什么第十个点会出re
433642
m泛函625楼主2021/1/29 19:31
#include<iostream>
#include<cstdio>
using namespace std;
int m, n;
char map[1001][1001];
int sum = 0;
void dfs(int x, int y)
{
	map[x][y] = '.';
	int xt,yt;
	int move[4][2] = { {0,1}, {1,0} ,{0,-1}, {-1,0} };
	for(int i=0;i<=3;i++)
		{
			xt = x + move[i][0];
			yt = y + move[i][1];
			if (xt < 1 || yt < 1||xt>m||yt>n)continue;
			if (map[xt][yt] == '#') { map[xt][yt] = '.';
			dfs(xt, yt);
			}
		}
	return;
}
bool jud(int x, int y)//判断是否是方形的水满法,关键一步是判断是否有拐角结构,即四个格子里有三个#
{
	int s=0;
	for (int i = 0; i <= 1; i++)
		for (int j = 0; j <= 1; j++)
			if (map[x + i][y + j] == '#')
				s++;
	if (s == 3)return false;
	else return true;
}
int main()
{
	cin >> m >> n;
	for (int i = 1; i <= m; i++)
		for (int j = 1; j <= n; j++)
			cin >> map[i][j];
	for (int i = 1; i <= m; i++)
		for (int j = 1; j <= n; j++)
			
			{
				if (!jud(i, j)) {
					cout << "Bad placement.";
					return 0;
				}
			}
	for (int i = 1; i <= m; i++)
		for (int j = 1; j <= n; j++)
			if (map[i][j] == '#')
			{
				dfs(i, j);
				++sum;
			}
	printf("There are %d ships.", sum);
	return 0;
}
2021/1/29 19:31
加载中...