题意:
输入一个图,判断其中是否存在十字,十字就是有两条垂直的横着或竖着穿过整个图的线,如下:
这样图的是非十字:
以‘.‘代替白色方格,以‘*’代替黑色方格,如果有十字直接输出0,如没有,输出需要将几个‘.‘变为‘*‘才能构成至少一个十字。
因为要求出最少要填的色,就找出每行每列的白色格子数,然后算每行每列的加和,最少的那个就是要填的最少数量。
1、将图存入二维char数组,并将每行每列‘.‘出现的次数分别存入数组
2、将各行各列’.‘出现的次数分别相加,找出最小值。要注意这个交点处的字符是不是‘.‘,如果是就相当于多加了一个,要减去1.
#include<bits/stdc++.h>
#define ll long long
#define speed_up ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
using namespace std;
int main()
{
speed_up;
int t;
cin>>t;
while(t--)
{
int m,n;
cin>>m>>n;
char s[m][n];
int x[m]={0},y[n]={0};
for(int i=0;i<m;i++)
{
for(int j=0;j<n;j++)
{
cin>>s[i][j];
if(s[i][j]==‘.‘)x[i]++;
if(s[i][j]==‘.‘)y[j]++;
}
}
int minn=x[0]+y[0];
for(int i=0;i<m;i++)
{
for(int j=0;j<n;j++)
{
int z=x[i]+y[j];
if(s[i][j]==‘.‘)z--;
minn=min(minn,z);
}
}
cout<<minn<<endl;
}
}
原文:https://www.cnblogs.com/SyrupWRLD999/p/13763965.html