【2018寒假集训 Day1】【位运算】翻转游戏
翻转游戏(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】【位运算】翻转游戏的更多相关文章
- 【2018寒假集训 Day1】【位运算】桐桐的运输方案
桐桐的运输方案(transp) [问题描述] 桐桐有 N 件货物需要运送到目的地,它们的重量和价值分别记为: 重量:W1,W2,…,Wn: 价值:V1,V2,…,Vn: 已知某辆货车的最大载货量为 X ...
- 牛客2018国庆集训 DAY1 D Love Live!(01字典树+启发式合并)
牛客2018国庆集训 DAY1 D Love Live!(01字典树+启发式合并) 题意:给你一颗树,要求找出简单路径上最大权值为1~n每个边权对应的最大异或和 题解: 根据异或的性质我们可以得到 \ ...
- 【2018寒假集训Day 1】【位运算】生成字符串
生成字符串(strs) [问题描述] 假设字符串只由字符“0”,“1”,“”组成,其中字符“”表示该字符可由 字符“0”或“1”替代. 现有一些字符串,根据这些字符串生成所有可生成的字符串.如: {1 ...
- 【2018寒假集训 Day2】【2019.5.11更新】【动态规划】花店橱窗布置(FLOWER)
花店橱窗布置(FLOWER) 提交文件名:flower 问题描述: 某花店现有F束花,每一束花的品种都不一样,同时至少有同样数量的花瓶,被按顺序摆成一行,花瓶的位置是固定的,从左到右按1到V顺序编号, ...
- 【2018寒假集训 Day2】【动态规划】维修栅栏
维修栅栏 问题描述: 小z最近当上了农场主!不过,还没有来得及庆祝,一件棘手的问题就摆在了小z的面前.农场的栅栏,由于年久失修,出现了多处破损.栅栏是由n块木板组成的,每块木板可能已经损坏也可能没有损 ...
- 【2018寒假集训 Day2】【动态规划】钱币兑换(exchange)(自己翻译的2333)
钱币兑换(exchange) 问题描述: Dave偶然获得了未来几天的美元(dollars)与马克(marks)之间的兑换率.例如Dave开始有100marks,请编写个程序帮助Dave找出最好的买卖 ...
- 【集训Day4 动态规划】【2018寒假集训 Day4 更新】蛙人
蛙人 (ple) 蛙人使用特殊设备潜水.设备中有一个气瓶,分两格:一格装氧气,另一格装氮气.留在水中有时间的限制,在深水中需要大量的氧气与氮气.为完成任务,蛙人必须安排好气瓶.每个气瓶可以用它的重量和 ...
- 清北学堂寒假集训DAY1
第一天,上午讲了些基本的技巧和简单算法,主要就是适应这里. 中午跑到食堂吃了顿“饭”(我并没有挖苦233333),然后回宿舍休息休息 因为 迎接我们的是模拟啊啊啊啊啊阿 下午题一发下来,并没有想象中的 ...
- 洛谷2018寒假集训tg第二次比赛第二题Princess Principal题解
这算不算泄题啊...被kkk发现会咕咕咕吧. 题目大意:给定一个数列a,与常数n,m,k然后有m个询问,每个询问给定l,r.问在a[l]到a[r]中最少分成几段,使每段的和不超过k,如果无解,输出Ch ...
随机推荐
- 使用SQLserver Management Studio连接VS2012自带数据库
下载 Microsoft® SQL Server® 2008 Management Studio Express http://www.microsoft.com/zh-CN/download/det ...
- POJ2431 优先队列+贪心 - biaobiao88
以下代码可对结构体数组中的元素进行排序,也差不多算是一个小小的模板了吧 #include<iostream> #include<algorithm> using namespa ...
- Nginx、WSGI、 uWSGI、 uwsgi的区别
当我们部署完一个应用程序,浏览网页时具体的过程是怎样的呢?首先我们得有一个 Web 服务器来处理 HTTP 协议的内容,Web 服务器获得客户端的请求,交给应用程序,应用程序处理完,返回给 Web 服 ...
- 学习笔记36_Razor
*Razor视图引擎 在添加视图的时候,视图引擎除了有“aspx”外,还有Razor(CSHTML),就会在对应的文件夹下,产生 view.cshtml文件,那么,以后写C#代码,就可以 @for(v ...
- 学习笔记33_EF跨数据库
在App.Config中,可以: (1)自定义类 public xxxxDbContext() { public XXXXDbContext():base("name=xxxxContain ...
- LeetCode 11月第1周题目汇总
开源地址:点击该链接 前言 最近一个多月发现以[每天一题]系列的形式来更新题目并不太合适,一是没有足够多合适的题目来更新,二是单独拿出来一个题来讲不太系统,应该把多个相似的题目放在一起讲,这样才能够达 ...
- Flex 和 Bison 使用方法
背景知识 在学编译原理的时候,同时在做南京大学的编译原理课程实验,这里是链接,整个实验的效果是实现一个完整的 C-- 语法的编译器.C-- 语法是他们老师指定的一种类 C 语言. Flex 和 Bis ...
- 使用jieba分析小说人物出现次数
分析: 1. 读取小说,以读的形式打开 with open('文件名.txt','r',encoding='utf8') as f: str = f.read() 2. 切割小说 ret = jieb ...
- 2019.NET Conf China(中国.NET开发者峰会)活动全纪录:.NET技术之崛起,已势不可挡
一.微软走向开放与.NET Core的诞生 当今时代,气象更新,技术飞速发展. 当今时代,开发者大概是最优秀的群体.每一位开发者,无不奋勇向前,努力追寻时代的步伐,以大无畏的精神迎接挑战,紧跟大时代成 ...
- Linux 学习(1) | 学习方向导图
方向导图 文件系统导图 内核导图