POJ3279 奶牛开关问题

题目是一道简单的开关问题(插句题外话,记得小时候玩过肯德基制作的一款Flash小游戏,就是根据开关问题来设计的。),要将一个M X N的黑白色相间的格子翻转为白色(翻转可会使指定格子以及其上下左右相邻的格子反色),并求出最优解。

解题思路是先指定第一行格子的翻转方法。并判断下一行与之相邻的格子是否需要翻转(连续翻转两次==不反转)。以此类推。判断最后一行是否全部为白色,如果不是全白则说明无解。

该算法复杂度为O(MN2^n),符合条件。这里注意,7&4=4,而不是返回1,二分DP里是判断是不是为0就行。

// int g=(7>>2&1),f=7&(1<<2);
     // cout<
#include 
#include
#include
using namespace std;
#define maxn 16
int tile[maxn][maxn];//每个位置原来的情况
int flip[maxn][maxn];//每个位置的翻转情况
int opt[maxn][maxn];
//枚举第一行的所有翻转状况
//根据第一行,判断下面每行的翻转情况
//写一个判断1个位置是否为白色的情况,原来的值+翻转的值,为偶数则为0
//最后一行确定完后,前m-1行都确保为白色了,只要判断最后一行是否为白色
int dir[5][2]={{0,0},{-1,0},{0,-1},{1,0},{0,1}};
int M,N;
#define inf 1<<29
int judge(int x,int y)
{
    int sum=tile[x][y];
    int nx,ny;
    for(int i=0;i<5;i++)
    {
        nx=x+dir[i][0];
        ny=y+dir[i][1];
        if(nx>=0&&nx=0&&ny>j&1;
        //flip[0][j]=i&(1<>2&1),f=7&(1<<2);
        // cout<=0&&num

你可能感兴趣的:(搜索)