http://icpc.upc.edu.cn/problem.php?cid=1803&pid=7
这道题就是给我们一堆符号,点就代表是白色,星号代表黑色。然后让我们判断黑色区域是否有十字形。
我的想法:
刚开始拿到这个题的时候,我的第一个思路就是,开一个二维字符数组,但是苦于数据规模太大,一开编译器就爆了;然后我有想过用结构体做,可是仍然需要很大的空间;最后在我们实验室的大佬的提示下,选择了用string类型做题。
算法思路:
其实这道题,主要就是卡我们时间和空间复杂度,处理好这些,其他就没有什么问题了。
首先,我们先记录每行和每列星号出现的频率,记为h[],l[]两个数组。
其次,我们遍历数组,每次都更改答案:
如果此字符为星号,答案更新为(答案)和(行列总数和h[i],和l[j]的差)中的小者;
如果此字符是点,答案更新为(答案)和(行列总数和h[i],和l[j]的差减一)中的小者。
然后贴下代码:
#include<bits/stdc++.h>
using namespace std;
string a[50010];
int n,m,h[50010],l[50010];
int main()
{
int q;
cin>>q;
while(q--)
{
memset(h,0,sizeof(h)),memset(l,0,sizeof(l));
cin>>n>>m;
int sum=0x3f3f3f;
for(int i=0;i<n;i++) cin>>a[i];
for(int i=0;i<n;i++)
{
for(int j=0;j<m;j++)
{
if(a[i][j]=='*')
{
h[i]++;
l[j]++;
}
}
}
for(int i=0;i<n;i++)
{
for(int j=0;j<m;j++)
{
if(a[i][j]=='*') sum=min(sum,n+m-h[i]-l[j]);
else sum=min(sum,n+m-h[i]-l[j]-1);
}
}
cout<<sum<<endl;
}
return 0;
}