今年新生校赛还是有很多人物de,而我打得却不尽人意,在这里只好把题目整理一下,希望能有点帮助。
/——————————————————————————————————————————————————————————/
**
- 描述
**
这天Jed教练给大家出了一道题目,想测试一下大家近期的训练状况。题目的内容如下:给你一个n*m的01矩阵,你现在有一个神奇的魔法盒,如果把这个魔法盒放到矩阵的某一个位置,那么与魔法盒同行同列的 ”1” 都会变成 ”0” (“0”不会有变化),现在问你能否用这个魔法盒把01矩阵里的1全部变成0 (注意:这个魔法盒只能使用一次,即你只有一次变动矩阵的机会)。
**
- 输入
**
本题为多组数据评测。
第一行 包含一个整数T(1≤T≤10),代表数据组数。
对于每组测试数据:
第一行 包含两个整数 n, m(1≤n, m≤100),分别表示矩阵的行数和列数。
接下来n行,每行是一个01字符串,描述整个01矩阵的状态。
输出
如果你能做到仅使用一次魔法盒把矩阵所有的1都变成0的话 输出“Yes”.
否则输出“No”.
**
样例输入
**
2
2 3
110
101
3 3
010
111
000
**
样例输出
**
No
Yes
基本思路:
这题的基本思路还是很简单,就是简单的对01矩阵进行处理,把二维的矩阵变成两个一维的 x,y 数组。
再对1的个数进行判断。
具体判断思路为:用两个for循环跑每个位置,若ans(当前位置x,y的1的个数) 等于tot(01矩阵1的总个数)。
**
以下为ac代码:
**
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cstdlib>
#include <cmath>
using namespace std;
const int maxn=500;
char s[maxn+5][maxn+5];//01矩阵
int x[maxn+5],y[maxn+5];//x[i]为每一列的1的出现次数;y[i]为每一行1的出现次数
int main()
{
int t;
scanf ("%d",&t);
while (t--)
{
int n,m;
scanf ("%d%d",&n,&m);
memset(s,'0',sizeof (s));//每一次while都要menset一波
memset(x,0,sizeof (x));
memset(y,0,sizeof (y));
int tot=0;
for (int i=1;i<=n;i++)
{
for (int j=1;j<=m;j++)
{
scanf (" %c",&s[i][j]);
if (s[i][j]=='1') x[i]++,y[j]++,tot++;//tot记1的个数
}
}
int flag=0;
for (int i=1;i<=n;i++)
{
for (int j=1;j<=m;j++)
{
int ans=x[i]+y[j];//ans为i,j时行+列的1的个数
if (s[i][j]=='1') ans--;//若s[i][j]为1 则重复计数了一次1
if (ans==tot) flag=1;//若行列ans==tot 则证明所有的1均在s[i][j]的i行,j列里
}
}
if (flag) printf ("Yes\n");
else printf ("No\n");
}
}
**
部分运行结果:
**