【POJ1753】Flip Game
【题目大意】
有一个4x4规格的一个棋盘,现在有16个一面黑一面白的棋子分布在这个棋盘上。
翻转一个棋子能够使它以及它上下左右的四个棋子从黑变白,从白变黑。
现在问你至少要经过多少次操作才能够使得整个棋盘的颜色相同。
【分析】
考虑到是4x4的规模,想到用BFS枚举+判重。
注意题目的内存限制是64MB,如果普通的用一个二维数组记录状态可能会超过内存限制。
考虑位运算,下面给出AC代码。
#include <iostream>
#include <fstream>
#include <string>
#include <cstdio>
#include <cmath>
#include <queue>
const int INF=0x7fffffff;
using namespace std;
struct map
{
int shu[];//位运算按行存储
int times;//翻转次数
map(){memset(shu,,sizeof(shu));}
}data;
bool hash[(<<)+];//哈希表 bool test(map t);//检测
map change(map t,int x,int y);
void print();//检测函数
int bfs();//广搜
int h(map t);//哈希函数 int main()
{
int i,j;
//文件操作
//freopen("data.txt","r",stdin);
//freopen("out.txt","w",stdout);
memset(data.shu,,sizeof(data.shu)); //读入数据
for (i=;i<=;i++)
{
if (i!=) getchar(); //读取换行符
for (j=;j<=;j++)
{
char temp;
scanf("%c",&temp);
//注意这里存储是从左向右存储
if (temp=='w') data.shu[i]=(data.shu[i]<<)+;
else data.shu[i]=(data.shu[i]<<)+;
}
}
int ans=bfs();
if (ans==INF) printf("Impossible\n");
else printf("%d",ans);
return ;
}
bool test(map t)//检测函数
{
int cnt=,i,j;
for (i=;i<=;i++) cnt+=t.shu[i];
if (cnt== || cnt==(*)) return ;
return ;
}
int bfs()
{
queue<map>Q;
memset(hash,,sizeof(hash));
int i,j;
data.times=;
hash[h(data)]=;
Q.push(data);//加入队列
while (!Q.empty())
{
map u=Q.front();Q.pop();
if (test(u)) return u.times;
for (i=;i<=;i++)
for (j=;j<=;j++)
{
map v=u;
v=change(v,i,j);
v.times=u.times+;
if (test(v)) return v.times;
if (hash[h(v)]==) continue;//哈希判重
Q.push(v);
hash[h(v)]=;
}
}
return INF;
}
int h(map t)//哈希函数
{
int temp=,i,j;
for (i=;i<=;i++) temp=(temp<<)+t.shu[i];
return temp;
}
//第x行,第y个
map change(map t,int x,int y)
{
t.shu[x]=((t.shu[x])^(<<(-y)));//本身
t.shu[x+]=((t.shu[x+])^(<<(-y)));//上面
t.shu[x-]=((t.shu[x-])^(<<(-y)));//下面
if (y!=) t.shu[x]=((t.shu[x])^(<<((-y)+)));//左边
if (y!=) t.shu[x]=((t.shu[x])^(<<((-y)-)));//右边
return t;
}
【POJ1753】Flip Game的更多相关文章
- 【LeetCode】字符串 string(共112题)
[3]Longest Substring Without Repeating Characters (2019年1月22日,复习) [5]Longest Palindromic Substring ( ...
- 【LeetCode】回溯法 backtracking(共39题)
[10]Regular Expression Matching [17]Letter Combinations of a Phone Number [22]Generate Parentheses ( ...
- 【Atcoder】ARC088 D - Wide Flip
[题目]D - Wide Flip [题意]给定n个数字的01序列,要求每次翻转>=k个数字使得全0,求最大的k.n<=10^5 [算法]数学 [题解]有两个角度可以得到等价的结论: 1. ...
- 181. Flip Bits【easy】
181. Flip Bits[easy] Determine the number of bits required to flip if you want to convert integer n ...
- 【Atcoder】ARC 080 F - Prime Flip
[算法]数论,二分图最大匹配 [题意]有无限张牌,给定n张面朝上的牌的坐标(N<=100),其它牌面朝下,每次操作可以选定一个>=3的素数p,并翻转连续p张牌,求最少操作次数使所有牌向下. ...
- 【转】ACM训练计划
[转] POJ推荐50题以及ACM训练方案 -- : 转载自 wade_wang 最终编辑 000lzl POJ 推荐50题 第一类 动态规划(至少6题, 和 必做) 和 (可贪心) (稍难) 第二类 ...
- 【原创】NIO框架入门(二):服务端基于MINA2的UDP双向通信Demo演示
前言 NIO框架的流行,使得开发大并发.高性能的互联网服务端成为可能.这其中最流行的无非就是MINA和Netty了,MINA目前的主要版本是MINA2.而Netty的主要版本是Netty3和Netty ...
- 【ACM】魔方十一题
0. 前言打了两年的百度之星,都没进决赛.我最大的感受就是还是太弱,总结起来就是:人弱就要多做题,人傻就要多做题.题目还是按照分类做可能效果比较好,因此,就有了做几个系列的计划.这是系列中的第一个,解 ...
- 【转】Netty那点事(二)Netty中的buffer
[原文]https://github.com/code4craft/netty-learning/blob/master/posts/ch2-buffer.md 上一篇文章我们概要介绍了Netty的原 ...
随机推荐
- paip.提升用户体验-----c++ gcc 命令在notepad++扩展中的配置..
paip.提升用户体验-----c++ gcc 命令在notepad++扩展中的配置.. 作者Attilax , EMAIL:1466519819@qq.com 来源:attilax的专栏 地址: ...
- 《深入Linux内核》 UNIX的一些故事
Unix文件的类型1.普通文件2.目录3.符号链接4.面向块的设备文件5.面向字符的设备文件6.管道和命名管道7.套接字 点评:不明觉厉 打开文件进程只能访问“打开的”文件.为了打开一个文件,进程调用 ...
- webserver/CGI
来自:http://blog.sina.com.cn/s/blog_466c6640010000nj.html 1. TUX2. lighttpd,thttpd,shttpd 3. 几种web s ...
- (转载)PCNTL函数族--PHP多进程编程
(转载)http://www.cnblogs.com/zox2011/archive/2013/02/19/2917448.html php有一组进程控制函数,使得php能在*nix系统中实现跟c一样 ...
- 模板:强连通分量&2-sat
void Tarjan(int x){ low[x]=ID[x]=++tot; st[++top]=x;Inst[x]=true; for(int i=fir[x];i;i=nxt[i]) if(!I ...
- 搜索与DP:SLIKAR
Problem: SLIKAR[题目描述]Josip 是个奇怪的画家,他想画一幅由 N*N 个点组成的图, N 是一个 2 的乘方 数(1, 2, 4, 8, 16 等.).每个点要么是黑色的,要么是 ...
- 【动态规划】Vijos P1037 搭建双塔
题目链接: https://vijos.org/p/1037 题目大意: 给n块砖的长度(n<=100),问从中任选m块砖能否建成2个相同高度的塔. 能的话求最高高度,不能输出 Impossib ...
- Struts2中OGNL
什么是OGNL OGNL:Object Graph Navigation Language 对象导航图语言 开源项目,取代页面中Java脚本,简化数据访问 和EL同属于表达式语言,但功能更为强大 让 ...
- 缓存的概念(反向代理、CDN)
缓存在我们的日常开发中随处可见,理解缓存的概念,本质就是就近处理,比如很多热点数据,访问量很多,我们需要使用,就可以把它 缓存起来,然后下次访问就不用再去数据库的去查询了,而是直接使用缓存,现在说说大 ...
- AABB包围盒、OBB包围盒、包围球的比較
1) AABB 包围盒: AABB 包围盒是与坐标轴对齐的包围盒, 简单性好, 紧密性较差(尤其对斜对角方向放置的瘦长形对象, 採用AABB, 将留下非常大的边角空隙, 导致大量不是必需的包围盒相交測 ...