码蹄杯2022年真题 房间打扫 题型:Fllofill/找规律

77 阅读1分钟

码题集OJ-房间打扫 (matiji.net)

我刚开始当做Floodfill来做了,但是没看见这句话:image.png

#include<bits/stdc++.h>
using namespace std;
const int N = 210;
typedef pair<int, int>PII;
char a[N][N];
int vis[N][N];
int flag[N][N];
int n;


int dx[] = { 0,1,0,-1 }, dy[] = {-1,0,1,0};
void dfs(int x,int y)
{
	memset(vis,-1,sizeof vis);

	queue<PII> q;
	q.push({ x,y });
	vis[x][y] = 1;


	while (!q.empty())
	{
		PII t = q.front();
		q.pop();

		for (int i = 0; i < 4; i++)
		{
			int tx = x + dx[i], ty = y + dy[i];
			if (tx < 0 || tx >= n || ty < 0 || ty >= n || vis[tx][ty] != -1||a[tx][ty]=='1')continue;
		
			flag[tx][ty] = 1;
			q.push({ tx,ty });
			vis[tx][ty] = 1;
		}
	}

}
int main()
{
	cin >> n;
	for (int i = 0; i < n; i++)
			cin >> a[i];


	for (int i = 0; i < n; i++)
	{
		for (int j = 0; j < n; j++)
		{
			if (a[i][j] == '0')
			{
				dfs(i,j);
			}
			if (a[i][j] == '1')flag[i][j] = 1;
		}
	}

	int cnt = 0;
	for (int i = 0; i < n; i++)
	{
		int f = 1;
		for (int j = 0; j < n; j++)
		{
			if (flag[i][j] == 0)f= 0;
			cout << flag[i][j] << " ";
		}
		cout << endl;
		if (flag)
		{
			cnt++;
		}
	}

	cout << cnt << endl;
	return 0;
}

image.png

这道题有个找规律的做法:

因为是一变就是一整列都变了,所以只有两行相同的字符串最后才能变成一样的。

image.png

因为问题就转化为了求相同字符串的最大个数。

那么就可以用哈希来做。

#include<bits/stdc++.h>
using namespace std;
int n;
unordered_map<string,int>mp;
int main()
{
	cin>>n;
	for(int i=0;i<n;i++)
	{
		string s;cin>>s;
		mp[s]++;
	}
	
	int ans; 
	for(auto &it:mp)
	{
		ans=max(ans,it.second);
	}
	
	cout<<ans;
	return 0;
}

c10afd4961554bbf4bab2c9a5bea747.png