2024年蓝桥杯周赛 4.Yaya与字符画【算法赛】4.Yaya与字符画【算法赛】

63 阅读1分钟

4.Yaya与字符画【算法赛】 - 蓝桥云课 (lanqiao.cn)

因为数据范围太大,所以优先考虑dp

比如有有1这个一个v:

image.png 我们肯定要取左右对角线最小的那个作为合法边,这样就可以取一个合法边,变为如下的合法V image.png

#include<bits/stdc++.h>
#define endl '\n'
#define int long long
using namespace std;
const int N = 2010;
int l[N][N], r[N][N];
int n, m;
int maxn=0;
void solve()
{
	cin >> n >> m;
	for (int i = 1; i <= n; i++)
	{
		for (int j = 1; j <= m; j++)
		{
			char op; cin >> op;
			if (op == '*')
			{
				l[i][j] = l[i - 1][j - 1] + 1;
				r[i][j] = r[i - 1][j + 1] + 1;
			}
			maxn = max(maxn,min(l[i][j],r[i][j]));
		}
	}
	cout << maxn-1;
}
signed main()
{
	cin.tie(nullptr)->sync_with_stdio;
	int t = 1;
	while (t--)
	{
		solve();
	}
	return 0;
}

#include<bits/stdc++.h>
using namespace std;
typedef pair<int, int>PII;
const int N = 2010;
char g[N][N];
int dist[N][N];
int n, m;
int ans;
int dx[] = { -1,-1 }, dy[] = {-1,1};
int dfs(int x, int y)
{
	int cnt = 0;
	int maxn = -1;

	memset(dist, 0, sizeof dist);
	queue<PII>q;
	q.push({x,y});
	dist[x][y] = 1;

	while (!q..empty())
	{
		PII t = q.front();
		q.pop();
		
		for (int i = 0; i < 2; i++)
		{
			int tx = t.first + dx[i], ty = t.second + dy[i];
			if (dist[tx][ty]==1||g[tx][ty]=='.')continue;
			if (tx<0 || ty<0 || tx>n || ty>m)break;
			if (g[tx][ty] == '*')
			{
				q.push({tx,ty});
				dist[tx][ty] = 1;
				cnt++;
			}
		}
	}

	return cnt/2;
}
int main()
{
cin >> n >> m;

	for (int i = 0; i < n; i++)
	{
		for (int j = 0; j < m; j++)
		{
			cin >> g[i][j];
		
		}
	}
	for (int i = 0; i < n; i++)
	{
		for (int j = 0; j < m; j++)
		{
			if (g[i][j] == '*')
				ans = max(ans, dfs(i, j));
		}
	}
	
	cout << ans;
	return 0;
}
#include<bits/stdc++.h>
using namespace std;
const int N = 2010;
char g[N][N];
int n, m;
int max_size;

int main()
{
	cin >> n >> m;
	for (int i = 0; i < n; i++)
	{
		for (int j = 0; j < m; j++)
		{
			cin >> g[i][j];
			if (g[i][j]=='*')
			{
				int size = 0;
				for(int k=1;k<=i&&j-k>=0&&j+k<m;k++)
				{
					if (g[i - k][j - k] == '*' && g[i - k][j + k] == '*')
					{
						size = k;
					}
					else break;
				}
				max_size = max(max_size,size);
			}
		}
	}

	cout << max_size << endl;
	return 0;
}