1000:翻转卡片
总时间限制:
-
3000ms
内存限制:
-
65536kB
描述
-
现在有N*N张卡片,组成了一个N*N的矩阵。这些卡片或者正面放置或者反面放置。现在,Acer想对这些卡片做一些翻转操作,使得所有的牌在翻转之后都正面朝上。在每一次操作中,Acer只能对一个M*M的子矩阵里的所有卡片做一次正反面翻转,也即将这个M*M矩阵中正面放置的卡片变成反面朝上,反面放置的卡片变成正面朝上。Acer想知道最少通过几次操作能够实现他的目标。
输入
-
第一行,两个整数N和M。
接下来的N行里,每一行1个整数。如果这个整数位1,表示这张对应的卡片在初始状态下时正面放置的;否则这张卡片最初是反面放置的。
对于所有数据,0<m<=n<=1000。< p="">
输出
-
一个整数,表示实现目标所需要的最小操作次数。如果不可能实现目标,请输出-1。
样例输入
-
4 2
1 1 0 0
0 0 1 1
1 1 1 1
0 0 0 0
样例输出
-
5
-
题目意思:给两个数,n和m,以及一个n*n的矩阵,在一个n*n的矩阵中,取任意的m*m的矩阵,进行翻转,1变成0,0变成1,问需要把所有的0变成1,也就是最后需要虽少的部数,得到矩阵中所有的全部为1,需要翻转最少多少次?
-
这道题,时间切的比较紧,算是简化了一点点的暴力法:
-
这道题,我用了两种表达方法,一个是最简单的递归,还算不上dfs,还有一个直接简单写:
-
先来看递归法:
-
#include<iostream>
#include<stdio.h>
using namespace std;
bool a
1000:翻转卡片
-
总时间限制:
- 3000ms 内存限制:
- 65536kB
-
描述
- 现在有N*N张卡片,组成了一个N*N的矩阵。这些卡片或者正面放置或者反面放置。现在,Acer想对这些卡片做一些翻转操作,使得所有的牌在翻转之后都正面朝上。在每一次操作中,Acer只能对一个M*M的子矩阵里的所有卡片做一次正反面翻转,也即将这个M*M矩阵中正面放置的卡片变成反面朝上,反面放置的卡片变成正面朝上。Acer想知道最少通过几次操作能够实现他的目标。 输入
-
第一行,两个整数N和M。
接下来的N行里,每一行1个整数。如果这个整数位1,表示这张对应的卡片在初始状态下时正面放置的;否则这张卡片最初是反面放置的。
对于所有数据,0<m<=n<=1000。< p="">
输出
- 一个整数,表示实现目标所需要的最小操作次数。如果不可能实现目标,请输出-1。 样例输入
-
4 2 1 1 0 0 0 0 1 1 1 1 1 1 0 0 0 0
样例输出
-
5
-
题目意思:给两个数,n和m,以及一个n*n的矩阵,在一个n*n的矩阵中,取任意的m*m的矩阵,进行翻转,1变成0,0变成1,问需要把所有的0变成1,也就是最后需要虽少的部数,得到矩阵中所有的全部为1,需要翻转最少多少次?
-
这道题,时间切的比较紧,算是简化了一点点的暴力法:
-
这道题,我用了两种表达方法,一个是最简单的递归,还算不上dfs,还有一个直接简单写:
-
先来看递归法:
-
#include<iostream> #include<stdio.h> using namespace std; bool a