题目描述

kkke在一个n*n的棋盘上进行一个翻转游戏。棋盘的每个格子上都放有一个棋子,每个棋子有2个面,一面是黑色的,另一面是白色的。初始的时候,棋盘上的棋子有的黑色向上,有的白色向上。现在kkke想通过最少次数的翻转,使得棋盘上所有的棋子都是同一个颜色向上的(即全是黑色向上的,或全是白色向上的)。每次翻转的时候,kkke可以选择任意一个棋子,将它翻转,同时,与它上下左右分别相邻的4个棋子也必须同时翻转。

输入输出格式

输入格式:

输入的第一行是一个整数n,表示棋盘是n*n的,

接下来有n行,每行包括n个字母,表示初始的棋盘状态。如果字母是w,则表示这个棋子当前是白色向上的,如果字母是b,则表示这个棋子当前是黑色向上的。

输出格式:

输出为一行,如果无法翻转出目标状态,则输出“Impossible”,否则输出一个整数,表示kkke最少需要翻转的次数。

输入输出样例

输入样例#1:

4
bwwb
bbwb
bwwb
bwww
输出样例#1:

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 翻转游戏 - 枚举 + 搜索的更多相关文章

  1. Luogu 1312 【NOIP2011】玛雅游戏 (搜索)

    Luogu 1312 [NOIP2011]玛雅游戏 (搜索) Description Mayan puzzle 是最近流行起来的一个游戏.游戏界面是一个7行5列的棋盘,上面堆放着一些方块,方块不能悬空 ...

  2. 【BZOJ4945】【NOI2017】游戏(搜索,2-sat)

    [NOI2017]游戏(搜索,2-sat) 题面 BZOJ的SPJ是假的 兹磁洛谷 题解 如果没有\(x\)地图的影响 这就是一个裸的\(2-sat\)问题 但是现在有不超过\(8\)个\(x\)地图 ...

  3. [Luogu P3825] [NOI2017] 游戏 (2-SAT)

    [Luogu P3825] [NOI2017] 游戏 (2-SAT) 题面 题面较长,略 分析 看到这些约束,应该想到这是类似2-SAT的问题.但是x地图很麻烦,因为k-SAT问题在k>2的时候 ...

  4. 294. 翻转游戏 II

    题目: 链接:https://leetcode-cn.com/problems/flip-game-ii/ 你和朋友玩一个叫做「翻转游戏」的游戏,游戏规则:给定一个只有 + 和 - 的字符串.你和朋友 ...

  5. NC235250 牛可乐的翻转游戏

    NC235250 牛可乐的翻转游戏 题目 题目描述 牛可乐发明了一种新型的翻转游戏! 在一个有 \(n\) 行 \(m\) 列的棋盘上,每个格子摆放有一枚棋子,每一枚棋子的颜色要么是黑色,要么是白色. ...

  6. hdu4431 Mahjong 枚举搜索。。

    japanese麻将什么玩意..都没有豪华七对... 没什么难的 就是枚举搜索了 分三种类型的胡牌 f1是七对 f2是十三幺 f3是普通的胡牌 就先找一对 再找三个三个的 就是一直超时..在峰峰的指导 ...

  7. 【BZOJ1501】【NOI2005】智慧珠游戏(搜索)

    [BZOJ1501][NOI2005]智慧珠游戏(搜索) 题面 我要一改我懒惰的作风 这道题目必须放题面 Description Input 文件中包含初始的盘件描述,一共有10行,第i行有i个字符. ...

  8. [Swift]LeetCode293. 翻转游戏 $ Flip Game

    You are playing the following Flip Game with your friend: Given a string that contains only these tw ...

  9. 【2018寒假集训 Day1】【位运算】翻转游戏

    翻转游戏(flip) [问题描述] 翻转游戏是在一个 4 格×4 格的长方形上进行的,在长方形的 16 个格上每 个格子都放着一个双面的物件.每个物件的两个面,一面是白色,另一面是黑色, 每个物件要么 ...

随机推荐

  1. VFS: Cannot open root device "nfs" or unknown-block(0,255)错误的解决

    1. 解决办法:在内核配置时候文件系统中选中Root file system on NFS

  2. vue 父向子组件传递数据,子组件向父组件传递数据方式

    父组件向子组件传递数据通过props,子组件引入到父组件中,设置一个值等于父组件的数据,通过:bind将数据传到子组件中,子组件中通过props接收父组件的数据,这样就可以使用父组件的数据了,循环组件 ...

  3. keras初探

    1.对网络的理解: 2.怎样训练,输入已经数据,经过训练,输入测试数据,得到相似数据 3.RNNs  循环神经网络

  4. 解题3(CoordinateCalculate)

    题目描述 开发一个坐标计算工具, A表示向左移动,D表示向右移动,W表示向上移动,S表示向下移动.从(0,0)点开始移动,从输入字符串里面读取一些坐标,并将最终输入结果输出到输出文件里面. 输入: 合 ...

  5. Hibernate一对多关联映射的配置及其级联删除问题

    首先举一个简单的一对多双向关联的配置: 一的一端:QuestionType类 package com.exam.entity; import java.util.Set; public class Q ...

  6. jQuery插件开发的两种方法及$.fn.extend的详解(转)

    jQuery插件开发的两种方法及$.fn.extend的详解 jQuery插件开发分为两种:1 类级别.2 对象级别,下面为大家详细介绍下   jQuery插件开发分为两种: 1 类级别 类级别你可以 ...

  7. 通过DataTable获得表的主键

    转载http://www.cnblogs.com/hobe/archive/2005/10/07/249940.html 通过DataTable获得表的主键 很多情形下我们需要知道表的主键是什么.在A ...

  8. Testng 常用总结

    自动化测试过程中使用testng管理测试用例是常规的做法,我们需要对它的特性有一个深入的了解和认识: testng的原理: 参考:https://blog.csdn.net/dm_vincent/ar ...

  9. STL-queue和循环队列基本操作的实现

    2018-11-13-17:53:44 1.可增长循环队列 队列是一种特殊的线性表,是一种先进先出(FIFO)的数据结构.它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入 ...

  10. 微信小程序开发——使用回调函数出现异常:TypeError: Cannot read property 'setData' of undefined

    关键技术点: 作用域问题——回调函数中的作用域已经脱离了调用函数了,因此需要在回调函数外边把this赋给一个新的变量才可以了. 业务需求: 微信小程序开发,业务逻辑需要,需要把获取手机号码的业务逻辑作 ...