POJ - 3279 Fliptile(反转)

博客介绍了POJ 3279题目,即矩阵翻转问题。通过分析,博主发现若已知第一行的翻转状态,则可确定除最后一行外的所有行的状态。当最后一行存在1时,无解。因此,博主提出枚举第一行翻转状态来寻找最小翻转次数,时间复杂度为O(n^2)。
摘要由CSDN通过智能技术生成

题意:一个01矩阵,每翻转一个格子,这个格子的上下左右的格子都会被翻转,要把整个矩阵的格子都翻转为0,求需要翻转的最小次数,最小次数的解为多个时,输出字典序最小的一组。解不存在输出IMPOSSIBLE。

思路:如果暴力搜索的话有2^{nm}种翻转的方法,超时。如果第一行是否翻转已经确定,那么第二行是否翻转也确定了,同理除了最后一行其余所有的格子是否翻转都已确定了,如果最后一行有1的话就说明不存在可行解。所以我们可以枚举第一行是否翻转的情况,对于每一种情况找可行解,求翻转最小次数,时间复杂度2^{n}nm

#include <stdio.h>
#include <string.h>
int flip[20][20],c[20][20],op[20][20];
int to[5][2] = {1,0,-1,0,0,1,0,-1,0,0};
int n,m;
int get(int x,int y)
{
    int i,num,tx,ty;
    num = c[x][y];
    for(i = 0; i < 5; i++) {
        tx = x + to[i][0];
        ty = y + to[i][1];
        if(tx >= 0 && ty >= 0 && tx < n &am
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值