题意:一个01矩阵,每翻转一个格子,这个格子的上下左右的格子都会被翻转,要把整个矩阵的格子都翻转为0,求需要翻转的最小次数,最小次数的解为多个时,输出字典序最小的一组。解不存在输出IMPOSSIBLE。
思路:如果暴力搜索的话有种翻转的方法,超时。如果第一行是否翻转已经确定,那么第二行是否翻转也确定了,同理除了最后一行其余所有的格子是否翻转都已确定了,如果最后一行有1的话就说明不存在可行解。所以我们可以枚举第一行是否翻转的情况,对于每一种情况找可行解,求翻转最小次数,时间复杂度
。
#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 &am