翻转游戏(flip)

【问题描述】

翻转游戏是在一个 4 格×4 格的长方形上进行的,在长方形的 16 个格上每

个格子都放着一个双面的物件。每个物件的两个面,一面是白色,另一面是黑色,

每个物件要么白色朝上,要么黑色朝上,每一轮你只能翻 3 至 5 个物件,从而由

黑到白的改变这些物件上面的颜色,反之亦然。每一轮被选择翻转的物件遵循以

下规则:

1、从 16 个物件中任选一个。

2、翻转所选择的物件的同时,所有与它相邻的左方物件、右方物件、上方物件

和下方物件(如果有的话),都要跟着翻转。

以下为例:

bwbw

wwww

bbwb

bwwb

这里”b”表示该格子放的物件黑色面朝上、”w”表示该格子放的物件白色朝

上。如果我们选择翻转第三行的第一个物件(如图所示),那么格子状态将变为:

bwbw

bwww

wwwb

wwwb

游戏的目标是翻转到所有的物件白色朝上或黑色朝上。你的任务就是写一个

程序来求最少的翻转次数来实现这一目标。

【输入格式】flip.in

输入文件包含 4 行,每行 4 个字符,每个字符”w” 或 “b”表示游戏开始时格子

上物件的状态。

【输出格式】flip.out

输出文件仅一个整数,即从给定状态到实现这一任务的最少翻转次数。如果给定

的状态就已经实现了目标就输出 0,如果不可能实现目标就输出”Impossible”。

【输入样例】

bwwb

bbwb

bwwb

bwww

【输出样例】

4

【解题思路】

把黑白当作01,把图每一行相接形成一行,转换成01串后化成十进制。

用BFS对每一个点进行翻转,从一个图可以拓展出16种状态,接着继续拓展。

而对每一个点的翻转操作,可以利用位运算中的异或运算。

依照参考程序中的做法,对左上角的翻转操作就是异或19,对右下角的翻转操作就是异或51200。

计算方法就是把要翻转的位置当作是1,别的位置当作是0,按照开头的方法转化成01串后转化成10进制。

【参考程序】

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int num;
string st,sr;
bool visit[65536];
struct data
{
int pic,step;
}que[65536];
int trans(string st)//b当作是1,w当作是0,转换成十进制整数
{
int ans=0,tmp=1;
if (st[0]=='b') ans+=tmp;
for (int i=1;i<=15;i++)
{
tmp=tmp<<1;
if (st[i]=='b')ans+=tmp;
}
return ans;
}
const int table[16]={19,39,78,140,305,626,1252,2248,4880,10016,20032,35968,12544,29184,58368,51200};//打表
int bfs(int num)
{
if (num==0||num==65535)
{
cout<<0;
return 0;
}
int head=0,tail=1;
que[head].pic=num;que[head].step=0;
visit[num]=true;
while (head<tail)
{
for (int i=0;i<16;i++)//拓展
{
que[tail].pic=que[head].pic^table[i];//翻转操作
if (!visit[que[tail].pic])
{
que[tail].step=que[head].step+1;
visit[que[tail].pic]=true;
if (que[tail].pic==0||que[tail].pic==65535)//判断是否到达目标
{
cout<<que[tail].step<<endl;
return 0;
}
tail++;
}
}
head++;
}
return -1;
}
int main()
{
freopen("flip.in","r",stdin);
freopen("flip.out","w",stdout);
cin>>st;
cin>>sr;st=st+sr;
cin>>sr;st=st+sr;
cin>>sr;st=st+sr;//转化成一行 int num=trans(st);
int ans=bfs(num);
if (ans==-1) cout<<"Impossible";
return 0;
}

【2018寒假集训 Day1】【位运算】翻转游戏的更多相关文章

  1. 【2018寒假集训 Day1】【位运算】桐桐的运输方案

    桐桐的运输方案(transp) [问题描述] 桐桐有 N 件货物需要运送到目的地,它们的重量和价值分别记为: 重量:W1,W2,…,Wn: 价值:V1,V2,…,Vn: 已知某辆货车的最大载货量为 X ...

  2. 牛客2018国庆集训 DAY1 D Love Live!(01字典树+启发式合并)

    牛客2018国庆集训 DAY1 D Love Live!(01字典树+启发式合并) 题意:给你一颗树,要求找出简单路径上最大权值为1~n每个边权对应的最大异或和 题解: 根据异或的性质我们可以得到 \ ...

  3. 【2018寒假集训Day 1】【位运算】生成字符串

    生成字符串(strs) [问题描述] 假设字符串只由字符“0”,“1”,“”组成,其中字符“”表示该字符可由 字符“0”或“1”替代. 现有一些字符串,根据这些字符串生成所有可生成的字符串.如: {1 ...

  4. 【2018寒假集训 Day2】【2019.5.11更新】【动态规划】花店橱窗布置(FLOWER)

    花店橱窗布置(FLOWER) 提交文件名:flower 问题描述: 某花店现有F束花,每一束花的品种都不一样,同时至少有同样数量的花瓶,被按顺序摆成一行,花瓶的位置是固定的,从左到右按1到V顺序编号, ...

  5. 【2018寒假集训 Day2】【动态规划】维修栅栏

    维修栅栏 问题描述: 小z最近当上了农场主!不过,还没有来得及庆祝,一件棘手的问题就摆在了小z的面前.农场的栅栏,由于年久失修,出现了多处破损.栅栏是由n块木板组成的,每块木板可能已经损坏也可能没有损 ...

  6. 【2018寒假集训 Day2】【动态规划】钱币兑换(exchange)(自己翻译的2333)

    钱币兑换(exchange) 问题描述: Dave偶然获得了未来几天的美元(dollars)与马克(marks)之间的兑换率.例如Dave开始有100marks,请编写个程序帮助Dave找出最好的买卖 ...

  7. 【集训Day4 动态规划】【2018寒假集训 Day4 更新】蛙人

    蛙人 (ple) 蛙人使用特殊设备潜水.设备中有一个气瓶,分两格:一格装氧气,另一格装氮气.留在水中有时间的限制,在深水中需要大量的氧气与氮气.为完成任务,蛙人必须安排好气瓶.每个气瓶可以用它的重量和 ...

  8. 清北学堂寒假集训DAY1

    第一天,上午讲了些基本的技巧和简单算法,主要就是适应这里. 中午跑到食堂吃了顿“饭”(我并没有挖苦233333),然后回宿舍休息休息 因为 迎接我们的是模拟啊啊啊啊啊阿 下午题一发下来,并没有想象中的 ...

  9. 洛谷2018寒假集训tg第二次比赛第二题Princess Principal题解

    这算不算泄题啊...被kkk发现会咕咕咕吧. 题目大意:给定一个数列a,与常数n,m,k然后有m个询问,每个询问给定l,r.问在a[l]到a[r]中最少分成几段,使每段的和不超过k,如果无解,输出Ch ...

随机推荐

  1. Just 5分钟!使用k3s部署轻量Kubernetes集群快速教程

    大小仅有40MB的k3s为想要节省开销进行开发和测试的企业提供了一个很好的选择.本文将用一种极为简洁的方式,教你在5分钟之内使用k3s部署轻量Kubernetes集群. Kubernetes已经改变了 ...

  2. unityweb Request请求

    UnityWebRequest是新的网络请求Api,分为LLApi和HLApi,其中LLApi为低级api,所谓低级api是指只是提供最基本的api接口,然后需要通过不同的参数来确定请求方式.为此un ...

  3. oc基本知识

    (一)构造函数 h文件 #import <Foundation/Foundation.h> @interface Student : NSObject { NSString *_name; ...

  4. Sping MVC不使用任何注解处理(jQuery)Ajax请求(基于XML配置)

    1. Spring Spring框架是一个轻量级的解决方案,是一个潜在的一站式商店,用于构建企业就绪的应用程序.Spring框架是一个Java平台,为开发Java应用程序提供全面的基础架构支持.Spr ...

  5. 深入理解.NET Core的基元(二) - 共享框架

    原文:Deep-dive into .NET Core primitives, part 2: the shared framework 作者:Nate McMaster 译文:深入理解.NET Co ...

  6. [2018-07-19] 安装python

    1.Python官网 https://www.python.org/downloads/ 2.应该使用Python2.x还是Python3.x? Python有2.x和3.x两个版本,这两个版本是不兼 ...

  7. 大数据之路week01--自学之集合_1(Collection)

    经过我个人的调查,发现,在今后的大数据道路上,集合.线程.网络编程变得尤为重要,为什么? 因为大数据大数据,我们必然要对数据进行处理,而这些数据往往是以集合形式存放,掌握对集合的操作非常重要. 在学习 ...

  8. 1.基础篇之vue入门

    为了建立高效团队,很多公司会采用全栈工程师,虽然利弊兼有,对于成本优先的创业团队,肯定是首选,特别是对.net生态圈,大部分都是小公司,就更加重要了.这里记录的是对vue的学习点滴,希望对你有所助力. ...

  9. python接口测试-数据驱动-DDT

    DDT是python的第三方库,全名称为:Data-Driven/Decorated Tests. ddt安装 通过pip安装ddt模块,安装Python后,Python自带pip功能包 切换到Pyt ...

  10. JAVA Rest High Level Client如何取聚合后得数据

    对于刚刚学习es的童鞋来说,很容易不清楚怎么获取客户端对es文档的聚合结果,下面就演示一下模仿DSL写聚合,然后获取到聚合对结果. 一, 对于下面这个简单的聚合,目的是对于文档全文匹配,聚合颜色字段. ...