Luogu 1764 翻转游戏 - 枚举 + 搜索
题目描述
kkke在一个n*n的棋盘上进行一个翻转游戏。棋盘的每个格子上都放有一个棋子,每个棋子有2个面,一面是黑色的,另一面是白色的。初始的时候,棋盘上的棋子有的黑色向上,有的白色向上。现在kkke想通过最少次数的翻转,使得棋盘上所有的棋子都是同一个颜色向上的(即全是黑色向上的,或全是白色向上的)。每次翻转的时候,kkke可以选择任意一个棋子,将它翻转,同时,与它上下左右分别相邻的4个棋子也必须同时翻转。
输入输出格式
输入格式:
输入的第一行是一个整数n,表示棋盘是n*n的,
接下来有n行,每行包括n个字母,表示初始的棋盘状态。如果字母是w,则表示这个棋子当前是白色向上的,如果字母是b,则表示这个棋子当前是黑色向上的。
输出格式:
输出为一行,如果无法翻转出目标状态,则输出“Impossible”,否则输出一个整数,表示kkke最少需要翻转的次数。
输入输出样例
4
bwwb
bbwb
bwwb
bwww
4
说明
【数据范围】
对于30%的数据,1<=n<=4
对于100%的数据,1<=n<=16
题解
看到这一题, 我试了试 IDA*, 看看能水几分, 没想到只能水30, 果断滚粗。
直接爆搜显然是会TLE 的, 那么只能考虑其他办法。
那么我们枚举第一行的翻转, 并把翻转后的图记录, 进行第二行的搜索。
由于第一行已经不能再翻, 如果第一行存在没有达到目标 颜色的棋子,只能由第二行来翻转。
所以可以根据第一行的颜色 来 给第二行进行翻转, 并且可能性仅一种。
这样一直翻转到最后一行结束, 那么除了最后一行 其他棋子 一定达到了目标颜色。
最后再判断最后一行棋子是否都达到了目标颜色, 如果达到了就更新答案。
代码
原谅我丑的不行的代码
#include<cstring>
#include<algorithm>
#include<cstdio>
#define rep(i,a,b) for( int i = (a); i <= (b); ++i )
#define per(i,a,b) for( int i = (a); i >= (b); --i )
using namespace std; const int N = , inf = ~0U >> ; int n, mp[N][N], ans, tmp[N][N];
char s[N]; int cal( int x , int pos ) {
return (x >> pos) & ;
} int work( int re , int col) {
rep( i, , n - ) rep( j, , n - ) if( tmp[i - ][j] != col ){
re++;
tmp[i][j] ^= ;
tmp[i + ][j] ^= ;
if(j) tmp[i][j - ] ^= ;
if(j != n - ) tmp[i][j + ] ^= ;
}
rep( j, , n - ) if( tmp[n - ][j] != col ) return inf;
return re;
} int dfs() {
int re = inf;
rep( i, , ( << n) - ) rep( col, , ){
rep( j, , n - ) rep( k, , n - ) tmp[j][k] = mp[j][k];
int cnt = ;
rep( j, , n - ) if( cal( i, j ) ) cnt++;
rep( j, , n - ) if( cal( i, j ) ^ cal( i , j - ) ^ cal( i, j + ) ) tmp[][j] ^= ;
rep( j, , n - ) if( cal( i, j ) ) tmp[][j] ^= ;
re = min( re, work(cnt, col) );
}
return re;
} int main()
{
scanf("%d",&n);
rep( i, , n - ) {
scanf("%s",s);
rep( j, , n - ) mp[i][j] = s[j] == 'w';
}
ans = dfs();
if( ans == inf ) printf("Impossible\n");
else printf("%d\n", ans);
}
Luogu 1764 翻转游戏 - 枚举 + 搜索的更多相关文章
- Luogu 1312 【NOIP2011】玛雅游戏 (搜索)
Luogu 1312 [NOIP2011]玛雅游戏 (搜索) Description Mayan puzzle 是最近流行起来的一个游戏.游戏界面是一个7行5列的棋盘,上面堆放着一些方块,方块不能悬空 ...
- 【BZOJ4945】【NOI2017】游戏(搜索,2-sat)
[NOI2017]游戏(搜索,2-sat) 题面 BZOJ的SPJ是假的 兹磁洛谷 题解 如果没有\(x\)地图的影响 这就是一个裸的\(2-sat\)问题 但是现在有不超过\(8\)个\(x\)地图 ...
- [Luogu P3825] [NOI2017] 游戏 (2-SAT)
[Luogu P3825] [NOI2017] 游戏 (2-SAT) 题面 题面较长,略 分析 看到这些约束,应该想到这是类似2-SAT的问题.但是x地图很麻烦,因为k-SAT问题在k>2的时候 ...
- 294. 翻转游戏 II
题目: 链接:https://leetcode-cn.com/problems/flip-game-ii/ 你和朋友玩一个叫做「翻转游戏」的游戏,游戏规则:给定一个只有 + 和 - 的字符串.你和朋友 ...
- NC235250 牛可乐的翻转游戏
NC235250 牛可乐的翻转游戏 题目 题目描述 牛可乐发明了一种新型的翻转游戏! 在一个有 \(n\) 行 \(m\) 列的棋盘上,每个格子摆放有一枚棋子,每一枚棋子的颜色要么是黑色,要么是白色. ...
- hdu4431 Mahjong 枚举搜索。。
japanese麻将什么玩意..都没有豪华七对... 没什么难的 就是枚举搜索了 分三种类型的胡牌 f1是七对 f2是十三幺 f3是普通的胡牌 就先找一对 再找三个三个的 就是一直超时..在峰峰的指导 ...
- 【BZOJ1501】【NOI2005】智慧珠游戏(搜索)
[BZOJ1501][NOI2005]智慧珠游戏(搜索) 题面 我要一改我懒惰的作风 这道题目必须放题面 Description Input 文件中包含初始的盘件描述,一共有10行,第i行有i个字符. ...
- [Swift]LeetCode293. 翻转游戏 $ Flip Game
You are playing the following Flip Game with your friend: Given a string that contains only these tw ...
- 【2018寒假集训 Day1】【位运算】翻转游戏
翻转游戏(flip) [问题描述] 翻转游戏是在一个 4 格×4 格的长方形上进行的,在长方形的 16 个格上每 个格子都放着一个双面的物件.每个物件的两个面,一面是白色,另一面是黑色, 每个物件要么 ...
随机推荐
- <assert.h>库学习
assert的初步认识 assert宏指令是用来诊断程序是否有误的,函数原型如下 void assert(int expression) 那为什么我们要使用assert而不用printf呢?因为ass ...
- 函数式编程语言(Functional Program Language)
(一) 什么是函数编程语言 简单说,"函数式编程"是一种"编程范式"(programming paradigm),也就是如何编写程序的方法论. 是一种编程典范, ...
- spring注解之@Lazy
今天主要从以下几方面来介绍一下@Lazy注解 @Lazy注解是什么 @Lazy注解怎么使用 1,@Lazy注解是什么 @Lazy注解用于标识bean是否需要延迟加载,源码如下: @Target({ ...
- mock.js 劫持 ajax,模拟数据
http://mockjs.com/ Mock.js 是一款前端开发中拦截Ajax请求再生成随机数据响应的工具.可以用来模拟服务器响应. 优点是非常简单方便, 无侵入性, 基本覆盖常用的接口数据类型. ...
- linux之docker学习
1.redis主从同步 可以主从数据同步,从库只读,只能手动切换主备关系2.redis哨兵 -准备redis主从数据库环境 -准备redis哨兵(可以有一个,可以有多个) -哨兵检测redis主库状态 ...
- HDU 3251 Being a Hero(最小割+输出割边)
Problem DescriptionYou are the hero who saved your country. As promised, the king will give you some ...
- f5 2017.09.03故障
1.下午14点50左右有同事反应epm等系统登录有问题.自测登录也是有同样的报错. 2.测试发现内部IP直接访问正常,但是访问f5的vip的方式访问不了.此时oa.邮件等系统也开始有同事发现故障. 3 ...
- f5备份与还原
1.需备份主机和备机的配置 2.1)备份到f5 恢复: 2)备份到本地
- Qt: 加入打印支持
写记事本打印功能所遇问题,记录以便于查阅. 在vs系统中开发Qt,加入打印支持,不似在QtCreator之pro文件中中加QT +=printsupport解决. 而要在vs(以vs2015为例)中, ...
- elasticsearch查询语句总结
query 和 filter 的区别请看:https://www.cnblogs.com/bainianminguo/articles/10396956.html Filter DSL term 过 ...