poj 1000 翻转卡片

该博客讨论了如何解决POJ 1000问题,即在限制每次翻转M*M的卡片矩阵的情况下,找到使所有卡片正面朝上的最小操作次数。博主提供了两种解决方案,一种是简单的递归法,另一种是简化后的直接算法,并给出了相应的C++代码示例。文章包含样例输入和输出,以及解题思路。
摘要由CSDN通过智能技术生成

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值