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>