C++实现简单搜索算法

这篇博客介绍了如何用C++实现一种简单的搜索算法,解决在N行M列的01矩阵中,通过最少翻转使得所有元素变为0的问题。文章阐述了算法思路,包括枚举第一行的可能性,利用位运算和搜索策略,并详细解释了如何处理相邻元素的关系,以及如何确定翻转次数最少的解。最后,给出了代码实现部分。
摘要由CSDN通过智能技术生成

1、简单搜索算法要求

       给一个N行M列的矩阵,值分别为0和1,每次你可以选择将一个变成相反状态,同时,它周围的四个数也会变为相反状态。 
问:最少翻转多少次,可以将所有值都变成0 
多个解,输出翻转次数最少的(若有次数相同解,输出字典序小的) 
若无解,输出”IMPOSSIBLE”

2、思路

      对于每个点,只能有两种操作,翻或不翻,若暴力所有可能性,需要2^(M*N)次操作,显然不可行 。所以有了这个法子。 先枚举第一行的所有可能性(2^M),搜索或位运算均可 。然后,对坐标(i, j)来说,如果(i-1, j)不为0,那么(i, j)必然需要翻转。 重复进行上操作由2至N 。此时,最后一行也已翻转完毕,如果最后一行全为0,得出结果 第一行的所有结果中取最小值。

3、代码实现

#include <stdio.h>
#include <iostream>
#include <vector>
#include <math.h>
#include <algorithm>
#include <queue>
#include <string.h>

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

大王算法

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值