SWUN2016_新生校赛_魔法盒

本文介绍了一个编程挑战,通过将01矩阵中的所有1变为0来测试算法能力。文章提供了问题描述、输入输出示例及AC代码实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

今年新生校赛还是有很多人物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");
}
}

**

部分运行结果:

**

这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值