Yet Another Crosses Problem 题解(暴力)

题目链接

题目大意

给出一个图,让你把 ’ . ’ 补成 ’ * ’ ,找出最少的数量形成一个满行和满列的字符星号字符;

题目思路

实话实说我实在没有觉得这题目很简单,但是确实又没有用到什么算法

其实这题的主要关键点就是找出每一行每一列星号字符的个数,然后再遍历整个图,可能有人问为什么还要遍历整个图,为什么不直接

用n+m-Rmax-Lmax,其实答案很简单,就是因为若点是交叉处,缺少一个星号,那么这个星号就可以作为两个星号的功能。

字符串本来应该用string,此题显然不能用字符数组 (鬼知道为什么我用了vector< char >

代码

代码比较简单,就不写注释了

#include
#include
#include
#include
#include
using namespace std;
const int maxn=5e4+5;
const int inf=0x3f3f3f3f;
int i,j,q,n,m,l[maxn],r[maxn],cnt;
vector a[maxn];
char ch;
int main()
{
    scanf("%d",&q);
    while(q--)
    {
        scanf("%d %d",&n,&m);
        for(i=1;i<=n;i++)
        {
            a[i].clear();//上一次的清0
            a[i].push_back(0);//第一个数赋值0
            for(j=1;j<=m;j++)
            {
                scanf(" %c",&ch);
                a[i].push_back(ch);
            }
        }
        for(i=1;i<=n;i++)
        {
            cnt=0;
            for(j=1;j<=m;j++)
            {
            if(a[i][j]=='.')
            {
                cnt++;
            }
            }
            l[i]=cnt;
        }
        for(j=1;j<=m;j++)
        {
            cnt=0;
            for(i=1;i<=n;i++)
            {
                if(a[i][j]=='.')
                {
                    cnt++;
                }
            }
            r[j]=cnt;
        }
        int ans,sum=inf;
        for(i=1;i<=n;i++)
        {
            for(j=1;j<=m;j++)
            {
                if(a[i][j]=='.')
                {
                    ans=-1;
                }
                else
                {
                    ans=0;
                }
                sum=min(sum,l[i]+r[j]+ans);
            }
        }
        printf("%d\n",sum);
    }
    return 0;
}

你可能感兴趣的:(思维)