我刚开始当做Floodfill来做了,但是没看见这句话:
#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;
}
这道题有个找规律的做法:
因为是一变就是一整列都变了,所以只有两行相同的字符串最后才能变成一样的。
因为问题就转化为了求相同字符串的最大个数。
那么就可以用哈希来做。
#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;
}