【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...

poj 1753 Filp Game

思路: 位运算加Bfs  ,参考了别人的思路,但是觉得只枚举第一行就可以,不用全部都枚举,今天太晚了,明天想一想 code #include #include #include #inc...
  • yueqiq
  • yueqiq
  • 2012年06月08日 00:20
  • 216

(枚举,dfs)Flip Game poj 1753

Flip game is played on a rectangular 4x4 field with two-sided pieces placed on each of its 16 square...
  • TchChan
  • TchChan
  • 2017年05月01日 18:57
  • 94

POJ 1753 Flip Game(枚举+dfs)

Flip Game Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 40052   Accepted: 17381...

POJ 1753-Flip Game(枚举&&DFS)

Flip Game Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 38472   Accepted: 1672...
  • MIKASA3
  • MIKASA3
  • 2016年04月26日 20:46
  • 291

POJ 1753 Flip Game 暴力搜索(dfs加枚举)

题目链接 http://poj.org/problem?id=1753 题目大意是给你一个4X4的棋盘,上面有黑白棋,每当你翻动一个棋子, 它的上下左右都会变颜色,现在让你求用最少的步数让他们全...
  • HHH_go_
  • HHH_go_
  • 2016年07月22日 23:36
  • 276

POJ 1753 Flip Game(暴力+DFS)

题目链接:http://poj.org/problem?id=1753 题        意:找出是所给的4*4由b,w组成的矩阵全部变为一种字符所需的步数。 思        路:其实每格棋子最多只...

文章标题 POJ 1753 : Flip Game(枚举+dfs)

Flip GameDescriptionFlip game is played on a rectangular 4x4 field with two-sided pieces placed on e...

poj1753 Flip Game(枚举Enum+dfs)

poj1753 Flip Game(枚举Enum+dfs)

poj 1753 Flip Game(dfs+枚举)

这道题,对我来说,真他妈的不容易!     代码如下: #include using namespace std; bool map[6][6],find=false; int step; ...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:【POJ】1753【DFS】【Filp game】【又、全熄灯全亮灯问题】
举报原因:
原因补充:

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