Flip Game
Time Limit: 1000MS   Memory Limit: 65536K
Total Submissions: 30449   Accepted: 13232

Description

Flip game is played on a rectangular 4x4 field with two-sided pieces placed on each of its 16 squares. One side of each piece is white and the other one is black 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 their upper side from black to white and vice versa. The pieces to be flipped are chosen every round according to the following rules:

  1. Choose any one of the 16 pieces.
  2. Flip the chosen piece and also all adjacent pieces to the left, to the right, to the top, and to the bottom of the chosen piece (if there are any).

Consider the following position as an example:



bwbw

wwww

bbwb

bwwb

Here "b" denotes pieces lying their black side up and "w" denotes pieces lying their white side up. If we choose to flip the 1st piece from the 3rd row (this choice is shown at the picture), then the field will become:



bwbw

bwww

wwwb

wwwb

The goal of the game is to flip either all pieces white side up or all pieces black side up. You are to write a program that will search for the minimum number of rounds needed to achieve this goal.

Input

The input consists of 4 lines with 4 characters "w" or "b" each that denote game field position.

Output

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

Sample Input

bwwb
bbwb
bwwb
bwww

Sample Output

4

Source

import java.util.ArrayDeque;
import java.util.Scanner; /*
* 首先有两点:
* 1.两颗棋子的翻动顺序不影响翻动结果
* 2.一颗棋子的偶数次翻动与0次翻动效果等同,一颗棋子的奇数次翻动与1次翻动效果等同
*
*/
public class poj1753 {
public static void main(String[] args) {
Scanner cin=new Scanner(System.in);
while (cin.hasNext()){
ArrayDeque<Node> qu=new ArrayDeque<Node>();//Java队列
Node node=new Node(0,0,0);
for (int i=1;i<=4;i++){
String s=cin.next();
for (int j=0;j<s.length();j++){
char c=s.charAt(j);
if (c=='b') {
node.state=(node.state<<1)+1;//黑棋子则将当前状态表示的二进制位设为1
}else{
node.state=node.state<<1;//白棋子则将当前状态表示的二进制位设为0
}
}
}
qu.add(node);//初始状态增加队列
boolean flag=false;
while (qu.size()!=0){
Node tou=qu.pop();//队头出队。以此队头衍生出下一颗棋子的翻动,并增加队尾
if (tou.state==0 || tou.state==(1<<16)-1){//(1<<16)-1的二进制位为16个1
System.out.println(tou.ways);//找到方法输出翻动棋子数
flag=true;
break;
}
if (qu.size()>0xFFFF) continue;//所有可能状态所有入队。不在有新的状态入队,下面循环体不再运行
for (int i=tou.location+1;i<=16;i++){//从当前头节点的位置向后找,1到16表示16个棋格的翻动
//状态(后改动),当前为第i个棋格的翻动。翻动棋格数为队头棋格翻动数+1
node=new Node(0,i,tou.ways+1);
//翻动当前棋子:队头与当前棋格翻动状态(比如左上角i=1状态为1后15个 0,即1000000000000000)的“异或”
node.state=tou.state^(1<<(16-i));
//翻动上相邻棋子:i-4>=1推断当前棋格是否有上相邻棋子
if (i-4>=1) node.state^=1<<(16-i+4);
//翻动下相邻棋子:i+4<=16推断当前棋格是否有下相邻棋子
if (i+4<=16) node.state^=1<<(16-i-4);
//翻动右相邻棋子:4的倍数为棋盘的右边界,无右相邻棋子,16-i再减1位运算少向左移动一位,所以是右边
if (i%4!=0) node.state^=1<<(16-i-1);
//翻动左相邻棋子:i-1为有边界时,加1后的i就是左边界
if ((i-1)%4!=0) node.state^=1<<(16-i+1);
qu.add(node);
}
}
if (!flag)//找不出合适翻动
System.out.println("Impossible");
}
}
}
class Node{
int state;//状态:state的二进制位表示16个棋格的状态
int location;//位置:当前状态为第i个棋格的翻动
int ways;//翻动棋格数
Node (int state,int location,int ways){
this.state=state;
this.location=location;
this.ways=ways;
}
}

java的ArrayDeque的使用

题目大意:4X4的一个棋盘上有白子("w")和黑子("b"),棋子的还有一面是相反的颜色,翻动一颗棋子。上下左右跟着翻动。问至少要翻动几颗棋子,才干使棋盘全白或全黑

poj1753,Flip Game,ArrayDeque&lt;Node&gt;的更多相关文章

  1. poj1753 Flip Game(BFS+位压缩)

    题目链接 http://poj.org/problem?id=1753 题意 一个棋盘上有16个格子,按4×4排列,每个格子有两面,两面的颜色分别为黑色和白色,游戏的每一轮选择一个格子翻动,翻动该格子 ...

  2. poj1753 Flip Game

    题意:4*4的正方形,每个格子有黑白两面,翻转格子使得4*4个格子显示全黑或全白,翻转要求:选中的那个格子,以及其上下左右相邻的格子(如果存在)要同时翻转.输出最小的达到要求的翻转次数或者Imposs ...

  3. POJ-1753 Flip Game (BFS+状态压缩)

    Description Flip game is played on a rectangular 4x4 field with two-sided pieces placed on each of i ...

  4. poj1753 Flip Game —— 二进制压缩 + dfs / bfs or 递推

    题目链接:http://poj.org/problem?id=1753 Flip Game Time Limit: 1000MS   Memory Limit: 65536K Total Submis ...

  5. POJ1753 Flip Game(bfs、枚举)

    链接:http://poj.org/problem?id=1753 Flip Game Description Flip game is played on a rectangular 4x4 fie ...

  6. POJ1753——Flip Game

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

  7. POJ-1753 Flip Game---二进制枚举子集

    题目链接: https://vjudge.net/problem/POJ-1753 题目大意: 有4*4的正方形,每个格子要么是黑色,要么是白色,当把一个格子的颜色改变(黑->白或者白-> ...

  8. POJ1753 Flip Game(位运算+暴力枚举)

    Flip game is played on a rectangular 4x4 field with two-sided pieces placed on each of its 16 square ...

  9. [POJ1753]Flip Game(异或方程组,高斯消元,枚举自由变量)

    题目链接:http://poj.org/problem?id=1753 题意:同上. 这回翻来翻去要考虑自由变元了,假设返回了自由变元数量,则需要枚举自由变元. /* ━━━━━┒ギリギリ♂ eye! ...

随机推荐

  1. php 制作略缩图

    一.需求 最近公司的项目中有个需求,就是用户上传自己的微信二维码,然后系统会自动将用户的微信二维码合并到产品中 二.分析 因为该系统是手机端的,所以从用户端的体验出发,用户当然是直接在微信上保存二维码 ...

  2. php 过滤敏感关键词

    php 过滤敏感关键词 function badwords($content){ $keywords=M("config")->where("name='badwo ...

  3. Cordova 开发环境搭建及创建第一个app

    整理记录使用cordova创建app应用程序并将其部署至Android系统移动设备上操作过程,具体如下: 一.前期安装环境 1. 安装JDK(java开发工具包) 2. 安装gradle 3. 安装A ...

  4. css的选择器效率分析

    我们都知道,CSS具有叠加性(同一个元素被多条样式规则指定),继承性(后代元素会继承前辈元素的一些样式和属性)和优先级 (由于CSS的叠加性和继承性,将产生优先级,这指的是哪条样式规则会最终作用于指定 ...

  5. Android RxVolley = Volley + RxJava + OkHttp

    Github:https://github.com/kymjs/RxVolley RxVolley使用文档 V1.0:http://rxvolley.mydoc.io/ 一.RxVolley使用指南 ...

  6. 【C++】cin、cout的效率比scanf和printf低的解决方法

    玩竞赛的同学应该发现了C++中直接调用cout.cin的效率要比printf和scanf的效率要低. 要解决这个问题,只需要在前面加上一句 std::ios::sync_with_stdio(fals ...

  7. android studio高德地图的显示于定位(附带逆地理编码围栏)

    首先注册高德成为开发者(打开高德地图,点击底部的开发者平台),创建应用,按照要求填写相应信息 网站:http://lbs.amap.com/api/android-sdk/guide/create-p ...

  8. JAVA面试题基础部分(二)

    10.使用 final 关键字修饰一个变量时,是引用不能变,还是引用的对象不能变?使用 final 关键字修饰一个变量时,是指引用变量不能变,引用变量所指向的对象中的内容还是可以改变的.例如,对于如下 ...

  9. [Intermediate Algorithm] - Arguments Optional

    题目 创建一个计算两个参数之和的 function.如果只有一个参数,则返回一个 function,该 function 请求一个参数然后返回求和的结果. 例如,add(2, 3) 应该返回 5,而 ...

  10. 卸载pycharm再重新安装后,找不到第三方库

    遇到的问题: 看到pycharm出了新的版本,手痒把旧的版本卸载,然后安装了最新的版本,然后问题就来了. 之前通过PIP命令安装的第三方库,import的时候都报错,找不到模块.既然以前能正常使用,现 ...