【题目大意】

有一个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的更多相关文章

  1. 【LeetCode】字符串 string(共112题)

    [3]Longest Substring Without Repeating Characters (2019年1月22日,复习) [5]Longest Palindromic Substring ( ...

  2. 【LeetCode】回溯法 backtracking(共39题)

    [10]Regular Expression Matching [17]Letter Combinations of a Phone Number [22]Generate Parentheses ( ...

  3. 【Atcoder】ARC088 D - Wide Flip

    [题目]D - Wide Flip [题意]给定n个数字的01序列,要求每次翻转>=k个数字使得全0,求最大的k.n<=10^5 [算法]数学 [题解]有两个角度可以得到等价的结论: 1. ...

  4. 181. Flip Bits【easy】

    181. Flip Bits[easy] Determine the number of bits required to flip if you want to convert integer n  ...

  5. 【Atcoder】ARC 080 F - Prime Flip

    [算法]数论,二分图最大匹配 [题意]有无限张牌,给定n张面朝上的牌的坐标(N<=100),其它牌面朝下,每次操作可以选定一个>=3的素数p,并翻转连续p张牌,求最少操作次数使所有牌向下. ...

  6. 【转】ACM训练计划

    [转] POJ推荐50题以及ACM训练方案 -- : 转载自 wade_wang 最终编辑 000lzl POJ 推荐50题 第一类 动态规划(至少6题, 和 必做) 和 (可贪心) (稍难) 第二类 ...

  7. 【原创】NIO框架入门(二):服务端基于MINA2的UDP双向通信Demo演示

    前言 NIO框架的流行,使得开发大并发.高性能的互联网服务端成为可能.这其中最流行的无非就是MINA和Netty了,MINA目前的主要版本是MINA2.而Netty的主要版本是Netty3和Netty ...

  8. 【ACM】魔方十一题

    0. 前言打了两年的百度之星,都没进决赛.我最大的感受就是还是太弱,总结起来就是:人弱就要多做题,人傻就要多做题.题目还是按照分类做可能效果比较好,因此,就有了做几个系列的计划.这是系列中的第一个,解 ...

  9. 【转】Netty那点事(二)Netty中的buffer

    [原文]https://github.com/code4craft/netty-learning/blob/master/posts/ch2-buffer.md 上一篇文章我们概要介绍了Netty的原 ...

随机推荐

  1. paip.提升用户体验-----c++ gcc 命令在notepad++扩展中的配置..

    paip.提升用户体验-----c++ gcc 命令在notepad++扩展中的配置.. 作者Attilax ,  EMAIL:1466519819@qq.com  来源:attilax的专栏 地址: ...

  2. 《深入Linux内核》 UNIX的一些故事

    Unix文件的类型1.普通文件2.目录3.符号链接4.面向块的设备文件5.面向字符的设备文件6.管道和命名管道7.套接字 点评:不明觉厉 打开文件进程只能访问“打开的”文件.为了打开一个文件,进程调用 ...

  3. webserver/CGI

    来自:http://blog.sina.com.cn/s/blog_466c6640010000nj.html   1. TUX2. lighttpd,thttpd,shttpd 3. 几种web s ...

  4. (转载)PCNTL函数族--PHP多进程编程

    (转载)http://www.cnblogs.com/zox2011/archive/2013/02/19/2917448.html php有一组进程控制函数,使得php能在*nix系统中实现跟c一样 ...

  5. 模板:强连通分量&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 ...

  6. 搜索与DP:SLIKAR

    Problem: SLIKAR[题目描述]Josip 是个奇怪的画家,他想画一幅由 N*N 个点组成的图, N 是一个 2 的乘方 数(1, 2, 4, 8, 16 等.).每个点要么是黑色的,要么是 ...

  7. 【动态规划】Vijos P1037 搭建双塔

    题目链接: https://vijos.org/p/1037 题目大意: 给n块砖的长度(n<=100),问从中任选m块砖能否建成2个相同高度的塔. 能的话求最高高度,不能输出 Impossib ...

  8. Struts2中OGNL

    什么是OGNL OGNL:Object Graph Navigation Language  对象导航图语言 开源项目,取代页面中Java脚本,简化数据访问 和EL同属于表达式语言,但功能更为强大 让 ...

  9. 缓存的概念(反向代理、CDN)

    缓存在我们的日常开发中随处可见,理解缓存的概念,本质就是就近处理,比如很多热点数据,访问量很多,我们需要使用,就可以把它 缓存起来,然后下次访问就不用再去数据库的去查询了,而是直接使用缓存,现在说说大 ...

  10. AABB包围盒、OBB包围盒、包围球的比較

    1) AABB 包围盒: AABB 包围盒是与坐标轴对齐的包围盒, 简单性好, 紧密性较差(尤其对斜对角方向放置的瘦长形对象, 採用AABB, 将留下非常大的边角空隙, 导致大量不是必需的包围盒相交測 ...