翻转游戏是在4*4的正方形里进行的,每个小正方形放有拥有黑白两面的棋子。每一轮你翻转3-5个棋子,把它从白变黑或从黑变白。

翻转的规则如下: 1. 选择任意一个棋子。 2. 翻转选择的棋子和与它相临的前后左右的棋子(如果有的话)

参考如下例子:

bwbw

wwww

bbwb

bwwb

其中 b表示黑色在上面,w表示白色在上面。如果选择第三行第一个棋子 进行翻转结果如下:

bwbw

bwww

wwwb

wwwb

游戏的目标在于使所有白色或所有黑色朝上,你的任务是计算完成目标所需要的最少步数。

[输入]

输入4行,每行4单词w或b,表示游戏初始格局。 [输出]:

输出完成目标所需最小步数。如果最初格局及达到目 标,输出0; 不能达到目标输出“Impossible”(不用引号)。 [样例]:

Sample Input :

bwwb

bbwb

bwww

Sample Output:

4

实际上我们完全可以只枚举第一行的操作,第一行有(翻,翻,翻,翻)(翻,翻,翻,不翻)。。。(不翻,不翻,不翻,不翻)16种,如果我们想把棋子全部翻成一种颜色的话,那么第二行的操作就是固定的了(因为第一行的 棋子的状态对第二行棋子的翻转进行了约束,如果想把第一行的棋子变成白色,那么第二行中位于第一行黑色棋子下方的位置必须翻转,反之亦然), 那么第三行、第四行的操作显然也是固定的了。

实现代码如下:

/**

*

*/

/**

*@author Administrator

*

*/

package fanzhuanQi;

import java.util.Scanner;

public class fanzhuan{

static int steps=Integer.MAX_VALUE;

//(x,y)坐标合起来就是中心点及上下左右坐标啦!

static int [] dx={0,0,0,1,-1};

static int[] dy={0,1,-1,0,0};

/**

*把每一行的状态和整个状态都以2进制表示,四个2进制数排成一行,组成整个状态。

*1010

*0000

*1101

*1001

*如图的状态表示为:1010000011011001

*@paramx横坐标点(注意:坐标系右下为(0,0)左上为(3,3))

*@paramy纵坐标点

*@paramsource(整个状态如上面的1010000011011001)

*@return改变确定位置的状态,如1变成0或者0变成1*/

public static int flip(int x,int y,int source)

{

if(x>=0&&x<4&&y>=0&&y<4)

source^=1<

return source;

}

/*

*@paramcurrent当前行

*@paramnum回合数

*@paramsource原数据,比如:1010000011011001

*@paramflag标志如果数据源当前位的状态不为flag,则翻动**/

public static void dfs(int current,int num,int source,int flag){

if(current==4)

{

if(source==0xFFFF||source==0)

{

//已经完成任务

steps=num

}

return ;

}

//把当前行都翻成同种颜色

int x,y;

for(int i=current-1,j=0;j<4;j++)//每行有4个,翻或者不翻共4种 ;翻动current行需要看current-1行的状态

{

if(((source&(1<>(i*4+j)^flag)==1){//判断当前行的j位置是否是flag标志,若不是则翻动

//source&(1<

for(int k=0;k<5;k++)//当前位置以及上下左右,5个位置翻动

{

x=current+dx[k];

y=j+dy[k];

source=flip(x, y, source);

}

num++;

}

}

dfs(current+1, num, source, flag);

}

/* 第一行共有16种翻法(翻,翻,翻,翻)(翻,翻,翻,不翻)。。。(不翻,不翻,不翻,不翻)

* * */

public static int solve(int source)

{

for(int i=0;i<16;i++)

{

int num=0;

int temp=source;

int x,y;

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

{

if((i&(1<0){

for(int k=0;k<5;k++){

x=0+dx[k];

y=j+dy[k];

temp=flip(x, y, temp);

}

num++;

}

}

dfs(1, num, temp, 0); //全部翻成白色

}

return steps==Integer.MAX_VALUE?-1:steps;

}

public static void main(String[] args)

{

Scanner scanner=new Scanner(System.in);

int source=0;

String string="";

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

{

string+=scanner.nextLine().trim();

}

for(int i=0;i

{

source=(i==0?source:(source<<1))+(string.substring(i, i+1).equals("b")?1:0);

}

if(solve(source)!=-1)

{

System.out.println(steps);

}else{

System.out.println("Impossible");

}

}

}

黑白翻转棋算法java实现_黑白翻转棋算法java实现相关推荐

  1. mllib协同过滤 java实现_协同过滤(ALS)算法介绍及Spark MLlib调用实例(Scala/Java/Python)...

    协同过滤 算法介绍: 协同过滤常被用于推荐系统.这类技术目标在于填充"用户-商品"联系矩阵中的缺失项.Spark.ml目前支持基于模型的协同过滤,其中用户和商品以少量的潜在因子来描 ...

  2. 蚁群算法java实现_简单蚁群算法 + JAVA实现蚁群算法

    一 引言 蚁群算法(ant colony optimization,ACO),又称蚂蚁算法,是一种用来在图中寻找优化路径的机率型技术.它由Marco Dorigo于1992年在他的博士论文中引入,其灵 ...

  3. 算法题库 java实现_[2]十道算法题【Java实现】

    前言 清明不小心就拖了两天没更了-- 这是十道算法题的第二篇了-上一篇回顾:十道简单算法题 最近在回顾以前使用C写过的数据结构和算法的东西,发现自己的算法和数据结构是真的薄弱,现在用Java改写一下, ...

  4. 基于内容的推荐java代码_三种推荐算法简介:基于用户的协同过滤、基于物品的协同过滤、基于内容的推荐...

    1.推荐算法 1.1.协同过滤 协同过滤是目前应用最广泛的推荐算法,它仅仅通过了解用户与物品之间的关系进行推荐,而根本不会考虑到物品本身的属性. 可分成两类: 1.基于用户(user-based)的协 ...

  5. java书籍_非科班,自学java需要把软件工程的课程全部学习完吗?

    问题一:非科班是否能自学Java.问题二:自学Java是否需要把软件工程课程全部学完?问题三:如何自学Java? 解决问题一:非科班是否能自学Java.不知道你是否有这个担心疑虑,从事Java技术开发 ...

  6. java 中间件_从头到尾说一遍Java(中间件)垃圾回收

    之前上学的时候有这个一个梗,说在食堂里吃饭,吃完把餐盘端走清理的,是 C++ 程序员,吃完直接就走的,是 Java 程序员. 确实,在 Java 的世界里,似乎我们不用对垃圾回收那么的专注,很多初学者 ...

  7. 如何java面试_短时间如何过java面试?

    这题我会!作为一个编程界老司机,我曾总结过一套Java常见的面试考点大全,不知道帮助过多少程序员拿下offer. 现在我把这套Java面试大全放出来,希望对大家有所帮助! 本文内容过长,建议大家先赞后 ...

  8. java获取java版本_在运行时获取Java版本

    最简单的方法(java.specification.version): double version = Double.parseDouble(System.getProperty("jav ...

  9. 拓扑排序之java实现_有向图和拓扑排序Java实现

    package practice; import java.util.ArrayDeque; import java.util.Iterator; import java.util.Stack; pu ...

  10. vim java 编程_你也用Vim写Java代码?

    献给所有曾试图写Java而痛苦挣扎的Vimers, 请不要害怕, 我也是你们的一员 序 文章源起于segmentfault论坛中的一个问题, 由于回答的有点尽性, 便转为文章. 题主应该是个Vim初学 ...

最新文章

  1. 《面向对象程序设计》c++第五次作业___calculator plus plus
  2. 理解LSTM/RNN中的Attention机制
  3. px/em/pt区别和转换
  4. UItableView的一些特殊点击效果
  5. Python基础教程学习笔记:第二章 列表和元组
  6. angular2--pipe管道使用
  7. ASP.NET MVC 个人学习笔记之 Controller传值
  8. 【转】Python可变长度的函数参数
  9. Docker 配置,详细说明 daemon.json 的作用
  10. Recurrent Neural Network系列1--RNN(循环神经网络)概述
  11. Linux开机启动过程(2):内核启动的第一步
  12. python编程多行输入_Python20-02_GUI编程----Text多行文本框详解
  13. Revit API多选多重过滤
  14. c语言4 答案详解,2019考研数据结构C语言版详解答案(4)
  15. Sublime Merge for Mac(git客户端软件)
  16. 2019年三峡大学计算机考研名单,三峡大学2019硕士研究生复试录取方案
  17. vue前期项目搭建所需要安装的插件,idea操作
  18. 不忘来时路 心系梦归处
  19. 使用HTML Purifier防止xss攻击
  20. 分组传送网——LTE/QoS/保护/时钟同步

热门文章

  1. HTML中ul等标签的用法
  2. Introduction to Oracle9i: SQL------- left join 和 left outer join 的区别
  3. Q102:光线追踪场景(5)——驭龙台
  4. java连接mongo_java 连接mongodb
  5. 企业如何选择数据可视化工具
  6. 家用无线路由器的相关设置
  7. mysql 中文 phpmyadmin_mysql中文乱码问题,phpmyadmin操作解决方法
  8. python类似turtle的库_Python库——turtle
  9. 为什么录像总是很暗_深度:为什么看马拉多纳的踢球视频,并不觉得他很厉害?...
  10. Shell脚本编程之(六)循环