poj-1753题题解思路
今天天气很好!
首先题意是这样的::
翻盖游戏是在一个长方形的4x4场上进行的,其16个方格中的每一个都放置了双面的棋子。每一块的一边是白色的,另一边是黑色的,每一块都是躺着的,要么是黑色的,要么是白色的。每一轮你翻转3到5块,从而改变他们的上边的颜色从黑色到白色,反之亦然。每一轮将翻转的棋子按照以下规则进行选择:
- 选择16件中的任何一件。
- 将选定的部分和所有相邻的部分翻转到左边、右边、顶部和所选部分的底部(如果有的话)。
- 以以下立场为例:
bwbw
瓦特
bbwb
bwwb
在这里,“b”表示其黑色一侧向上的部分,而“w”表示其白色一侧向上的部分。如果我们选择从第3行翻转第1部分(此选择显示在图片中),则字段将成为:bwbw
bwww
瓦布
瓦布
游戏的目标是翻转所有的棋子,白色的一面向上或所有的碎片黑色的一面向上。您将编写一个程序,该程序将搜索实现此目标所需的最小轮数。 - 那么首先我用的是BFS解
#include<iostream>
#include<queue>
#include<cstring>
using namespace std;
typedef struct table {
int pic[6][6];
}table;table start; //初始状态
int P[16] = { 1,2,4,8,16,32,64,128,256,512,1024,2048,4096,8192,16384,32768 };
bool vis[65536]; //状态数组
int dist[65536];
queue<table>Q;
//黑0 白1
char Negate(int ch)
{
if (ch)
return 0;
return 1;
}void turn(int x, int y, table& T)
{
T.pic[x][y] = Negate(T.pic[x][y]); //自身
T.pic[x][y - 1] = Negate(T.pic[x][y - 1]); //左侧
T.pic[x][y + 1] = Negate(T.pic[x][y + 1]); //右侧
T.pic[x - 1][y] = Negate(T.pic[x - 1][y]); //上侧
T.pic[x + 1][y] = Negate(T.pic[x + 1][y]); //下侧
}int get_dec(table T) //位压缩
{
int dec = 0;
int s = 0;
for (int i = 4; i > 0; --i)
for (int j = 4; j > 0; --j)
{
dec += T.pic[i][j] * P[s];
s++;
}
return dec;
}int BFS()
{
Q.push(start); //初始状态入队
int st = get_dec(start); //获取索引
vis[st] = true;
int front = 1, rear = 2;
table Now;
while (front < rear)
{
Now = Q.front(); //头结点出队
Q.pop();
int index = get_dec(Now); //获取索引
if (index == 0 || index == 65535) //找到终点
return front;
for (int i = 0; i < 16; ++i)
{
int x = i / 4 + 1; //横坐标
int y = i % 4 + 1; //纵坐标
table Next = Now;
turn(x, y, Next); //变换求下一步
int ni = get_dec(Next);
if (!vis[ni])
{
vis[ni] = true;
Q.push(Next);
dist[rear] = dist[front] + 1;
rear++;
}
}
front++;
}
return -1;
}int main() {
for (int i = 0; i < 6; ++i)
for (int j = 0; j < 6; ++j)
start.pic[i][j] = 0;
memset(vis, 0, sizeof(vis));
for (int i = 1; i <= 4; ++i)
for (int j = 1; j <= 4; ++j)
{
char ch;
cin >> ch;
if (ch == 'w')
start.pic[i][j] = 0;
else
start.pic[i][j] = 1;
}int s = BFS();
if (s != -1)
cout << dist[s] << endl;
else
cout << "Impossible" << endl;
return 0;
}
2.判重用康拓展开,把状态转换成排列序号的来
poj-1753题题解思路的更多相关文章
- POJ 1753. Flip Game 枚举or爆搜+位压缩,或者高斯消元法
Flip Game Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 37427 Accepted: 16288 Descr ...
- [ACM训练] 算法初级 之 基本算法 之 枚举(POJ 1753+2965)
先列出题目: 1.POJ 1753 POJ 1753 Flip Game:http://poj.org/problem?id=1753 Sample Input bwwb bbwb bwwb bww ...
- 枚举 POJ 1753 Flip Game
题目地址:http://poj.org/problem?id=1753 /* 这题几乎和POJ 2965一样,DFS函数都不用修改 只要修改一下change规则... 注意:是否初始已经ok了要先判断 ...
- poj 1753 2965
这两道题类似,前者翻转上下左右相邻的棋子,使得棋子同为黑或者同为白.后者翻转同行同列的所有开关,使得开关全被打开. poj 1753 题意:有一4x4棋盘,上面有16枚双面棋子(一面为黑,一面为白), ...
- POJ 1222 POJ 1830 POJ 1681 POJ 1753 POJ 3185 高斯消元求解一类开关问题
http://poj.org/problem?id=1222 http://poj.org/problem?id=1830 http://poj.org/problem?id=1681 http:// ...
- ACM ICPC 2018 青岛赛区 部分金牌题题解(K,L,I,G)
目录: K Airdrop I Soldier Game L Sub-cycle Graph G Repair the Artwork ———————————————————— ps:楼主脑残有点严 ...
- 穷举(四):POJ上的两道穷举例题POJ 1411和POJ 1753
下面给出两道POJ上的问题,看如何用穷举法解决. [例9]Calling Extraterrestrial Intelligence Again(POJ 1411) Description A mes ...
- Codeforces Round #519 by Botan Investments(前五题题解)
开个新号打打codeforces(以前那号玩废了),结果就遇到了这么难一套.touristD题用了map,被卡掉了(其实是对cf的评测机过分自信),G题没过, 700多行代码,码力惊人.关键是这次to ...
- Good Bye 2019(前五题题解)
这套也是后来补得. 我太菜了,第三题就卡着了.想了好久才做出来,要是参加了绝对掉分. D题是人生中做完的第一道交互题,不容易. 比赛传送门 A.Card Game 题目大意:一共有n张互不相同的牌,玩 ...
随机推荐
- onload事件属性,JQ中的load,ready方法
onload事件属性,JQ中的load,ready方法 前言 页面中的很多操作,需要我们在所需资源下载完成后,才可以进行操作,而资源没有及时下载,我们进行操作的话,是会报错.因此我们需要熟练掌握哪些事 ...
- C++重载、覆盖与隐藏——转载
http://www.cnblogs.com/qlee/archive/2011/07/04/2097055.html 成员函数的重载.覆盖与隐藏成员函数的重载.覆盖(override)与隐藏很容易混 ...
- 更新到@vue/cli 4.1.1版本的前端开发前的准备
一.概念简述 1.node.js目的是提供一个JS的运行环境. 2.npm(node package manager)是一个JS包管理器. 二.检查自己的电脑是否已安装相关配置 1.查看node.js ...
- 简易数据分析 15 | Web Scraper 高级用法——CSS 选择器的使用
这是简易数据分析系列的第 15 篇文章. 年末事情比较忙,很久不更新了,后台一直有读者催更,我看了一些读者给我的私信,发现一些通用的问题,所以单独写篇文章,介绍一些 Web Scraper 的进阶用法 ...
- redis 集群模式
redis cluster 介绍 自动将数据进行分片,每个 master 上放一部分数据 提供内置的高可用支持,部分 master 不可用时,还是可以继续工作的 在 redis cluster 架构下 ...
- Redis 都有哪些数据类型?分别在哪些场景下使用比较合适?
redis 主要有以下几种数据类型: string hash list set sorted set string 这是最简单的类型,就是普通的 set 和 get,做简单的 KV 缓存. set c ...
- 【题解】CF986E Prince's Problem(树上差分+数论性质)
[题解]CF986E Prince's Problem(树上差分+数论性质) 题目大意: 给定你一棵树,有点权\(val_i\le 10^7\).现在有\(m\)组询问给定参数\(x,y,w\)问你对 ...
- Codeforces Round #612 (Div. 2)
https://codeforces.com/contest/1287/ A - Angry Students 题意:求A后面的P最长连续有几个? 题解:? int n; char s[200005] ...
- Fabric1.4:链码管理与测试
1 链码介绍 智能合约在 Hyperledger Fabric 中称为链码(chaincode),是提供分布式账本的状态处理逻辑.链码被部署在fabric 的网络节点中,能够独立运行在具有安全特性的受 ...
- 解决httpclient设置代理ip之后请求无响应的问题
httpclient这个工具类对于大家来说应该都不陌生吧,最近在使用过程中出现了碰到一个棘手的问题,当请求的接口地址由http变成https之后,程序执行到 httpClient.execute(ht ...