POJ1753 FlipGame

2023-11-09

分类:状压、暴力枚举

参考博客:

https://www.cnblogs.com/honeycat/p/5176211.html

代码是这位博主原创的,加了点注释

题目:

http://poj.org/problem?id=1753

 

1.

用16位的int型数a来表示棋盘的状态 ,简化问题

2.

用另一个16位int数b表示将要翻转的棋子。用a和b的异或运算表示翻转棋子的操作,异或运算的结果a^b =c表示翻转后的状态。

比如:翻转第9枚棋子

a=1010 0000 1101 1001

b=0000 1000 1100 1000

c=1010 1000 0001 0001

3.

***对于某一个棋子集合的翻转操作,最终的结果与这些棋子翻转的顺序无关,只与集合本身有关。

证明:异或运算符合交换律和结合律

***对于一个棋子,翻转0、2、4...偶数次的结果都一样。翻转1、3、5...奇数次的结果都一样。

证明:b^b =1  a^b^b = a

4.

这样,问题就变成:在一局游戏中,选择一个操作,在这个操作中,对于每一个棋子只有2个选择:翻/不翻。

共有C0/16+C1/16+C2/16+...C16/16种操作。

如果所有的可能操作都不能结束游戏,那么输出impossible。

如果可以结束游戏,选择翻棋子数目最小的一种操作,输出棋子数目。

 

#include <iostream>
using namespace std;
const int inf = 0x7fffffff;  //32-bit int的最大值,符号位为0,其他的都是1
char s[4][4];
int cs[16] = { 0x13,0x27,78,140,305,626,1252,2248,4880,8992,20032,35968,12544,29184,58368,51200 };//保存翻第i格子的变化值
int po[16] = { 1,2,4,8,16,32,64,128,256,512,1024,2048,4096,8192,16384,32768 };//保存2^i
int main()
{
	int value = 0;
	int cmin = inf;
	char c;

	for (int i = 0; i < 16; i++)  //用16位的二进制数,表示状态
	{
		cin >> c;
		if (c == 'b')  //二进制的1代表black 0代表white   第i个数读到b 第i位就置1
			value += (int)po[i];  //  0000 0000 0000 0001  ...
		else
			continue;
	}

	for (int i = 0; i < 65536; i++)
	{//枚举所有状态
		int cou = 0;  //每次循环初始化最小次数
		int cvalue = value;  //初始状态

		for (int j = 0; j < 16; j++)
			if (i & (int)po[j]) //i枚举的是翻转方案的状态,在i的每一个二进制位上1代表翻0代表不翻,此句把这个状态翻译成要在棋盘上所做的操作,  po[j]  的二进制形式,只有第j位为1  一
				//依次检查i的第j位,若是1则执行下面语句,翻转第j个棋子
			{
				cou++;
				cvalue ^= cs[j];  //异或赋值。如: a^=b相当于:a=a^b      
				//cs[j]中  翻动第j个棋子影响的区域在cs[j]的二进制中,表示为1  与1进行异或,cvalue中 1->0  0->1  实现翻转
			}

		// 最终状态与翻牌次序无关,只与待翻牌的集合有关,即:依次翻 4 10 13号牌的结果 与 依次翻13 10 4号牌的结果是相同的!
		// 故只需要枚举所有的待翻牌组合即可, 上面for循环实现此功能

		if (cvalue == 0 || cvalue == 65535)//全黑或全白
			if (cou < cmin)  //若本轮的状态下,所用次数小于当前最小值,
				cmin = cou;
	}

	if (cmin == inf) cout << "Impossible\n";
	else cout << cmin << endl;

	system("pause");
	return 0;
}

 

 

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

POJ1753 FlipGame 的相关文章

  • 使用FFT算法计算

    给定在平面上的点 1 0 2 0 n 0 上发现的一组 n 个粒子电荷载流子 在 i 0 点发现的粒子电荷记为 Qi 作用在粒子上的力由以下公式给出 C is a Coulomb s constant 给出一个算法来计算 Fi 对于总复杂度
  • 字符串排序真的是 O(n^2logn) 吗? [复制]

    这个问题在这里已经有答案了 我读了以下内容 排序需要 O NlogN 那么它怎么是 O N 2logN 我们在这里想念的是 两个字符串的比较不是 O 1 在最坏的情况下 需要 在 所以最终的复杂度是O N 2logN 它是否正确 我一直认为
  • 线性代数如何在算法中使用?

    我的几个同行都提到 学习算法时 线性代数 非常重要 我研究了各种算法并学习了一些线性代数课程 但我没有看到其中的联系 那么线性代数如何应用在算法中呢 例如 图的连接矩阵可以带来哪些有趣的事情 三个具体例子 线性代数是现代 3D 图形的基础
  • Codility 钉板

    尝试了解 Codility NailingPlanks 的解决方案 问题链接 https app codility com programmers lessons 14 binary search algorithm nailing pla
  • 确定解决迷宫问题的最小线段数

    我有一个问题 我需要定义一个具有最少数量的顶点的多边形 该多边形与不透明的图像中的每个像素相交或包含每个像素 令 N 为图像中的像素数 我唯一的假设是图像的边界 孔 内不能包含透明像素 并且至少有两个像素是不透明的 举个例子 假设我有以下图
  • 如何从一组重叠的圆计算多边形集?

    这个问题是一些计算细节的扩展这个问题 https stackoverflow com questions 1667310 combined area of overlapping circles 假设有一组 可能重叠的 圆 并且希望计算这组
  • 高维最近邻搜索的最佳数据结构

    我实际上正在处理高维数据 50 000 100 000 个特征 并且必须对其执行最近邻搜索 我知道随着维度的增长 KD 树的性能很差 而且我还了解到 一般来说 所有空间分区数据结构都倾向于对高维数据执行详尽的搜索 此外 还有两个重要事实需要
  • 我需要一个支持高效随机访问和 O(k) 插入和删除的容器

    我再次尝试问同样的问题question https stackoverflow com questions 3808708 delete parts of a dynamic array and grow other 但我最终提出了一个不同
  • 如何将一组重叠范围划分为不重叠范围?

    假设您有一组范围 0 100 一 0 75 b 95 150 c 120 130 d 显然 这些范围在某些点上重叠 您将如何剖析这些范围以生成不重叠范围的列表 同时保留与其原始范围相关的信息 在本例中为范围后面的字母 例如 运行算法后的上述
  • 寻找将集合映射到整数的双射函数

    对于任意两个序列 a b 其中 a a1 a2 an 且 b b1 b2 bn 0a b具有相同的元素 而不关心它们的顺序 例如 如果 a 1 1 2 3 b 2 1 3 1 c 3 2 1 3 则 f a f b f a f b 我知道有
  • Karasuba算法递归过多

    我正在尝试用 c 实现 Karasuba 乘法算法 但现在我只是想让它在 python 中工作 这是我的代码 def mult x y b m if max x y lt b return x y bm pow b m x0 x bm x1
  • 从三点求圆心的算法是什么?

    我在圆的圆周上有三个点 pt A A x A y pt B B x B y pt C C x C y 如何计算圆心 在Processing Java 中实现它 我找到了答案并实施了一个可行的解决方案 pt circleCenter pt A
  • 带路径压缩算法的加权 Quick-Union

    有一种 带路径压缩的加权快速联合 算法 代码 public class WeightedQU private int id private int iz public WeightedQU int N id new int N iz new
  • 计算两点之间的最短路线

    过去几周我一直在开发一款多人 HTML5 游戏 使用nodejs and websockets 我已经被这个问题困扰了一段时间 想象一下 我用数组实现了这个平铺地图 如下所示 1 or 棕色瓷砖 路上有障碍物 玩家无法通过 0 or 绿色瓷
  • 绘制多边形

    我正在使用 Google Maps API V3 根据路径绘制多边形 该路径是随机未排序坐标点 LatLng 的数组 这会产生以下形状 Polylines intersect Problem 由于多边形的形状取决于路径中点的顺序 因此如何对
  • 迭代任意大小的子集

    我可以迭代大小为 1 的子集 for int a 0 a lt size a 或大小为 2 的子集 for int a1 0 a1 lt size a1 for int a2 a1 1 a2 lt size a2 or 3 for int
  • 给定一个具有多个重复条目的数组,找到一个重复条目 O(N) 时间和常数空间

    我们得到了一个大小为 N 的数组 其中包含 0 到 N 2 范围内的整数 包括 0 和 N 2 该数组可以有多个重复的条目 我们需要在 O N 时间和常量空间中找到重复条目之一 我正在考虑取数组中所有条目的乘积和总和 以及 0 到 N 2
  • 具有 2 个属性的背包算法。如何在 3d 数组中实现它?

    当有超过 1 个属性时 我无法理解背包问题 当有 1 个属性时 我必须编写一个使用具有 2 个属性的背包算法的程序 老师告诉我们 它必须在 3d 数组中完成 错误的实现将导致 O 2 n 处理时间 我无法想象这样的数组会是什么样子 假设这是
  • 归并排序中递归树的高度log(n)+1是怎么来的

    我按照 stackoveflow 的建议阅读了一些问题和答案 我正在遵循 cormen 的 算法简介 一书进行自学 那本书里已经解释得很清楚了 但唯一没有解释的是如何在合并排序分析中计算树的高度 如果在后面的章节中对此进行解释的话 我仍然在
  • Florian 的 Grisu2 算法如何工作?

    我遇到了一个关于将 double 转换为 ascii 的问题 经过搜索 我得到了 Florian 的论文 使用整数快速准确地打印浮点数 http www cs tufts edu nr cs257 archive florian loits

随机推荐

  • Ubuntu 设置时区

    我们要设置成 CST 时区 以保证正确地显示日期 时间 我们常看到的时区有如下几个 PST 美国太平洋标准时间 PST GMT 8 GMT 格林尼治平均时间 等同于英国伦敦本地时间 UTC 通用协调时间 UTC GMT CST 北京时间 北
  • MVC 网上招聘系统的设计与实现java jsp 程序设计 课程设计 毕业设计-附源码02135

    因上传问题 只上传了文案 图片未上传 网上招聘系统的设计与实现 摘 要 随着时代的发展 中国的互联网技术愈加成熟 已经有越来越多的社会群体开始学会使用互联网技术 整个社会正在朝着智能化 信息化的方向前进 有了互联网 用户便可以足不出户地利用
  • 【转载】版本管理软件综述(VSS及其他)

    版本管理软件综述 VSS的使用 http www cnblogs com liuchaogege p 4465652 html 什么是版本控制 1 怎样对研发项目进行整体管理 2 项目开发小组的成员之间如何以一种有效的机制进行协调 3 如何
  • Latex图片格式——从png,jpg,jpeg等导出到eps

    Latex图片格式 从png jpg jpeg等导出到eps Windows 在安装了texlive的情况下 应该都安装了 不然怎么编译latex文档嘞 在图片文件夹运行cmd 输入 bmeps c test png test eps 完成
  • vue el-table展开需要绑定row-key

  • openGLES3.0编程指南源码运行

    前言 openGLES3 0编程指南随书源码环境配置和例子运行 在这篇文章中 笔者给出了官网例子配置和运行 但是我自己新建的单独工程源码正确 但依然无法运行程序 遇到的坑 印象深刻 记录一下 错误做法 openGL ES Emulator
  • windows powershell 里怎么从C盘跳到D盘?

    直接在C根目录时输入d 进入其他盘同理 PS C gt d
  • 关于SAR的研究热点——几点思考

    关于SAR的研究热点 几点思考 SAR研究热点之一 新体制论证 SAR系统设计追求的目标 图像质量高 空间和辐射分辨率高 成像幅宽大 具备多模式 扫描 可变入射角条带 斜视 聚束 多波段 全极化 三维成像 动目标检测与成像能力 对平台运动姿
  • 今日头条自媒体矩阵运营攻略

    你今天通常做什么 许多人用它来娱乐八卦 寻找乐趣 并打发时间 但对于媒体和品牌来说 它是一个非常好的操作平台 基于媒体矩阵标题数量的改进及其独特的推荐机制 公司传播品牌 打造个人品牌非常友好 今天我们讨论了标题号如何快速建立个人品牌的综合潜
  • Hexo一些实用的插件

    Hexo的插件真是个好东西 一开始部署博客的时候并没有太在意插件的问题 毕竟觉得博客主题自带的插件挺全面的 足够使用了 但是用久了总是会腻 就想着静态博客能不能整一些新操作 即使只是添加点小功能 于是就翻了翻 Hexo 的插件目录 挑了些比
  • Android BLE学习笔记

    http blog csdn net xiaoyaoyou1212 article details 51854454 个人网站 http www xiaoyaoyou1212 com 欢迎吐槽围观 前言 本文主要描述Android BLE的
  • 链式基数排序(第十章 P286 算法10.15,10.16,10.17)

    链式基数排序 概述 基数排序 radix sort 属于 分配式排序 distribution sort 基数排序也叫做多关键字排序 基数排序是一种借助 多关键字排序 的思想来实现 单关键字排序 的内部排序算法 多关键字排序的方法 n 个记
  • fastjson 重复引用和循环引用问题

    数据传输使用json格式再方便不过了 fastjson 由阿里巴巴那伙人使用Java语言编写 号称最快的JSON库前两天遇到一个问题 后台的数据转化为json字符串后发送到前台出现了 ref字样的东西 后来明白了这是引用 在传输的数据中出现
  • 【LKM】makefile的支持c99的方法: ccflags-y := -std=c99

    如果写的C代码中 变量的定义在 函数之后 则会warning warning ISO C90 forbids mixed declarations and code Wdeclaration after statement 解决办法 1 正
  • 子关卡卸载actor不完全的问题解决。

    在子关卡中 actorA里面挂接n个actor 结果卸载actorA时 挂接的那些actor没有随之卸载掉 解决办法也简单 给这些actor设置owner为actorA即可 即在actorA所在的类里 生成这些挂载的actor时 FActo
  • linux在欢迎界面restart,[Linux]如何手动触发kernel restart

    所谓Linux panic就是碰到错误情况时 code里主动调的一个函数panic 里面出不来 会让cpu重启 不允许再乱执行代码 以便保留现场 像下面这个例子 就是在kernel fault函数里检查到非法无效地址访问后的错误处理 主动调
  • MySQL的服务层和存储引擎层

    1 服务层 Server Layer 服务层是MySQL的顶层组件 负责处理客户端与MySQL服务器之间的交互 它提供了一组API和协议 使应用程序能够连接到MySQL服务器 并发送查询 事务管理 用户权限控制等请求 服务层负责解析和优化查
  • 区块链技术关键词

    区块链技术 区块链是一种分布式账本技术 通过将数据以区块的形式依次链接在一起 并使用密码学技术保证安全性和一致性 加密货币 加密货币是基于区块链技术的数字资产 例如比特币 Bitcoin 和以太坊 Ethereum 等 它们使用区块链来记录
  • neo4j入门(三) 在数据库已知存在的节点上创建新的边

    from py2neo import Graph Node Relationship from py2neo import NodeSelector graph Graph http localhost 7474 username neo4
  • POJ1753 FlipGame

    分类 状压 暴力枚举 参考博客 https www cnblogs com honeycat p 5176211 html 代码是这位博主原创的 加了点注释 题目 http poj org problem id 1753 1 用16位的in