根据题意,给定一个 \(2\times2\) 的仅包含 \(0\) 和 \(1\) 的二维数组。定义一个操作,每次可以选择一行和一列将其变成 \(0\),求最小操作次数。

思路:根据枚举可得共有 \(14\) 种矩阵形态,通过观察可得:

  1. 当矩阵中 \(1\) 的数量为 \(0\) 时,即只有一种形态,其最小操作次数为 \(0\)。

  2. 当矩阵中 \(1\) 的数量为 \(1\) 时,共有四种形态(分别是 \(1\) 分布在四个角),此时最小操作次数为 \(1\)。

  3. 当矩阵中 \(1\) 的数量为 \(2\) 时,共有四种形态(分别是在同一行或同一列,在对角线上),其最小操作次数为 \(1\)。

  4. 当矩阵中 \(1\) 的数量为 \(3\) 时,共有四种形态(其形状类似于中文笔画中的横折,将其进行旋转),这时最小操作次数为 \(1\)。

  5. 当矩阵中 \(1\) 的数量为 \(4\) 时,只有一种形态,其最小操作次数为 \(2\)。

做法一:根据判断形态得出答案,可以通过此题,但做法二更优,此处使用做法二。

做法二:综上所述,可得当 \(1\) 的数量为 \(0\) 时,最小操作数为 \(0\);当 \(1\) 的数量为 \(1/2/3\) 时,最小操作数为 \(1\);当 \(1\) 的数量为 \(4\) 时,最小操作数为 \(2\)。即通过计算 \(1\) 的数量来得出答案,可以直接省去数组。

#include<cstdio>
#include<iostream>
using namespace std;
int t;//共有t组数据
int a;
int cnt;//计算1的数量
int main(){
scanf("%d",&t);
while(t--){
cnt=0;
for(int i=0;i<4;i++){
scanf("%d",&a);
cnt+=a;//统计1的数量
}
if(cnt==0) puts("0");
else if(cnt==1||cnt==2||cnt==3) puts("1");
else puts("2");
}
return 0;
}

最新文章

  1. java中的反射简单实例
  2. TCP三次握手四次挥手
  3. Chrome 控制台指南
  4. SharePoint 2010 文档管理系列之文档搜索
  5. 二、Android学习第二天——初识Activity(转)
  6. andorid jni入门教程一之helloworld
  7. DOM中元素节点、属性节点、文本节点的理解
  8. BZOJ 3170 松鼠聚会(XY坐标)
  9. ControlStyles(枚举)
  10. 进程退出前删除自身EXE
  11. 【百度地图API】让用户选择起点和终点的驾车导航
  12. 前端到后台ThinkPHP开发整站(2)
  13. 201521123108 《Java程序设计》第4周学习总结
  14. 【shell基础】数学计算
  15. Linux Kernel API
  16. Android根据图片Uri获取图片path绝对路径的几种方法【转】
  17. tmux 共享窗口大小
  18. NOI.AC NOIP模拟赛 第二场 补记
  19. NVelocity语法常用指令
  20. warning C4305:“初始化”:从“double”到“float”截断

热门文章

  1. 20220303模拟赛题解and总结
  2. linux篇-linux面试题汇总
  3. CSS基础学习(二)
  4. python面向对象(封装、多态、反射)
  5. Node.js躬行记(21)——花10分钟入门Node.js
  6. 深入C++03:面向对象
  7. Linux Cgroup v1(中文翻译)(2):CPUSETS
  8. c++ 树状数组
  9. 【抬杠C#】如何实现接口的base调用
  10. 一文带你搞懂 JWT 常见概念 &amp; 优缺点