题意:要用最少的步骤将题目所给的矩阵中的所有1都变为0,已知每次反转一个点时,其周围与其有公共边的格子都会反转。
做法:有条理的做,想要全部反转,首先要从局部开始,例如,先把第一行全部变为0,若第一行有n列,那么相应的对第一行的操作一共就有2^n种,每一种方法不一定都能将第一行全部置为0,更有可能没有一种方法将第一行置为0,假定随便选一种方法作用于第一行,因为反转一个点会使其上下左右都反转,若第一行仍有某个点为1,那么下一行与其对应着同一列的那个点就必须反转(不管其原来是1还是0),从而使得第一行全部变为0,这也从而得到了下一行的反转方案,依次类推,直到做完最后一行的方案。此时若最后一行还有1,则说明此种方案不可行,否则,则成功。
#include <iostream>
#include <algorithm>
#include <cstring>
#include <cstdio>
using namespace std;
int m,n;
int cur[20];
int tmp[20];
int getBit(int x, int i){ // 获取第i列的值