【POJ】1753【DFS】【Filp game】【又、全熄灯全亮灯问题】

原创 2013年12月03日 11:13:04

Description

Flip game is played on arectangular 4x4 field with two-sided pieces placed on each of its16 squares. One side of each piece is white and the other one isblack and each piece is lying either it's black or white side up.Each round you flip 3 to 5 pieces, thus changing the color of theirupper side from black to white and vice versa. The pieces to beflipped are chosen every round according to the followingrules:
  1. Choose any one of the 16 pieces.
  2. Flip the chosen piece and also all adjacent pieces tothe left, to the right, to the top, and to the bottom ofthe chosen piece (if there are any).(四周包括自己颜色全变)
    【POJ】1753 <wbr>又、全熄灯全亮灯问题【Flip <wbr>Game】Consider the following positionas an example:

    bwbw
    wwww
    bbwb
    bwwb
    Here "b" denotes pieces lying their black side up and "w" denotespieces lying their white side up. If we choose to flip the 1stpiece from the 3rd row (this choice is shown at the picture), thenthe field will become:

    bwbw
    bwww
    wwwb
    wwwb
    The goal of the game is to flip either all pieces white side up orall pieces black side up. You are to write a program that willsearch for the minimum number of rounds needed to achieve thisgoal.

Input

The input consists of 4 lineswith 4 characters "w" or "b" each that denote game fieldposition.

Output

Write to the output file asingle integer number - the minimum number of rounds needed toachieve the goal of the game from the given position. If the goalis initially achieved, then write 0. If it's impossible to achievethe goal, then write the word "Impossible" (without quotes).

Sample Input

bwwb
bbwb
bwwb
bwww

Sample Output

4

//看到这个图我就明白了,再次不解释,呵呵~用到位运算,把每一种状态转换为一个int数据

#include <stdio.h>

#include <stdlib.h>

#define MAX 65540

int flag[MAX],step[MAX];//flag[]作为标记,step[]作为记录次数

//用链表很可恶的RE,所以改为顺序队列

#define int_ int  

typedef struct queue{

 int_ *front;

 int_ *rear;

}Queue;

void InitQueue(Queue *Q){

 Q->front=Q->rear=malloc(sizeof(int_)*65536*2);

}

void EnQueue(Queue *Q,int e){

 *(Q->rear++)=e;

}

void GetPop(Queue *Q,int *e){

 *e=*(Q->front++);

}

int Empty(Queue *Q){

 if(Q->front==Q->rear)

  return 1;

 return 0;

}

int main(){

 Queue s;

 int i,j,n=0,m;

 char c;

 InitQueue(&s);

 for(i=0;i<4;i++){

  for(j=0;j<4;j++){

   scanf("%c",&c);

   n<<=1;

   if(c=='b')

    n++;

  }

  getchar();

 }

 if(n==0 || n==65535){

  printf("0\n");

  return 0;

 }

 EnQueue(&s,n);

 flag[n]=1;

 while(!(Empty(&s))){

  GetPop(&s,&n);//对头元素

  for(i=0;i<4;i++)

   for(j=0;j<4;j++){

    m=n;

    if(i==0)//只翻转下一行的同列元素

     m^=1<<(11-4*i-j);//15-4*(i+1)-j

    else if(i==3)//只翻转上一行的同列元素

     m^=1<<(19-4*i-j);//15-4*(i-1)-j

    else{//上下两行

     m^=1<<(11-4*i-j);

     m^=1<<(19-4*i-j);

    }

    if(j==0)//只翻转同行的下一列元素和自身,因为同一列的11即3的2进制

     m^=3<<(14-4*i-j);//15-4*i-j、15-4*i-(j+1)

    else if(j==3)

     m^=3<<(15-4*i-j);//15-4*i-(j+1)、15-4*i-j

    else

     m^=7<<(14-4*i-j);//111即为7的2进制

    if(m==0 || m==65535){

     printf("%d\n",step[n]+1);

     return 0;

    }

    if(!flag[m]){

     EnQueue(&s,m);

     flag[m]=1;

     step[m]=step[n]+1;

    }

   }

 }

 printf("Impossible\n");

 return 0;

}

poj 1753 filp game 2015年暑假训练第一题 枚举

题意就是说:翻牌,随便翻到一张牌,其上下左右随他都得翻,看最少用翻几张牌,能够让16张牌全为正或全为负。 这道题有一个大坑,就是每一张牌其实只能翻奇数次,比如翻的顺序为 (3,2)->   (2...
  • sholck222
  • sholck222
  • 2015年06月30日 14:28
  • 425

POJ 1753 翻棋子 (dfs+递归)。

终于来填坑了。依旧是递归的题目,最近做的都是关于递归的问题。下一个是汉诺塔问题。 这道题也是看了很多别人的博客才弄出来的,但是分析还是要试着自己写一下。 题意是这样的,有一个4*4的棋盘,你可以自...
  • Vit_rose
  • Vit_rose
  • 2016年05月20日 10:20
  • 745

POJ1222熄灯问题

问题描述: 程序代码: /* *思路1:枚举所有可能的开关状态,对每个状态计算下最后灯的情况,看是否都熄灭 * 每种按钮有两种状态,一共有30个开关,那么状态数是2的30次方,太多不可...
  • november_chopin
  • november_chopin
  • 2017年02月16日 12:38
  • 897

一次搞懂全排列——LeetCode四道Permutations问题详解

LeetCode中与Permutations相关的共有四题:   31. Next Permutation   46. Permutations   47. Permutations II  ...
  • Jacky_chenjp
  • Jacky_chenjp
  • 2017年03月26日 17:52
  • 2552

DFS深度优先搜索(2)--poj1321(棋盘问题 经典DFS)

棋盘问题  Time Limit:1000MS    Memory Limit:10000KB    64bit IO Format:%lld & %llu Description...
  • Acmer_Sly
  • Acmer_Sly
  • 2016年09月10日 14:17
  • 1269

poj_1753 递归+枚举

思路是别人的,自己理解了半天,渣渣
  • yeruby
  • yeruby
  • 2014年04月08日 20:48
  • 1574

POJ-2811:熄灯问题

题目描述:(此题目是2012北大信科夏令营上机考试题目) 总时间限制: 1000ms 内存限制: 65536kB 描述有一个由按钮组成的矩阵,其中每行有6个按钮,共5行。每...
  • SmarterYu
  • SmarterYu
  • 2013年06月30日 17:21
  • 1846

poj 3984 迷宫问题 dfs 求迷宫路径

题目地址:http://poj.org/problem?id=3984 利用图论中深搜的思想,存在边就是x,y ->  x+1,y  还有x,y -> x,y+1   然后仍然是访问未访问的而且不是墙...
  • jingqi814
  • jingqi814
  • 2013年09月25日 18:03
  • 3283

DFS之枚举排列组合

枚举可重复排列的模板 #include using namespace std; int n,m,ans[15]; int a[15];//待排列的数存储在此 bool vis[15]; void ...
  • u013615904
  • u013615904
  • 2015年01月29日 19:41
  • 1705

一起学mini2440裸机开发(一)--第一个led灯点亮

开发板:mini2440, NandFlash:K9F2G08U0B 256M大小,CPU:S3C2440A  。     开发环境:MDK4.11     仿真器:Jlink v8     这是我用...
  • mybelief321
  • mybelief321
  • 2013年05月10日 20:12
  • 5912
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:【POJ】1753【DFS】【Filp game】【又、全熄灯全亮灯问题】
举报原因:
原因补充:

(最多只允许输入30个字)