题目传送门

题意描述

有\(4 \times 4\)的正方形,每个格子要么是黑色,要么是白色,当把一个格子的颜色改变(黑\(\to\)白 或 白\(\to\)黑)时,其周围上下左右(如果存在的话)的格子的颜色也被反转,问至少反转几个格子可以使\(4 \times 4\)的正方形变为纯白或者纯黑?

分析

对于每一个格子,只有两个状态,将它翻转一次与翻转奇数次效果是一样的,翻转零次与翻转偶数次的效果是一样的。

因为只有\(16\)个格子,选择\(0\)个,\(1\)个,\(2\)个\(\cdots16\)个所有的情况有

C[0][16]+C[1][16]+C[2][16]+...+C[15][16]+C[16][16]=2^16

枚举不会超时,所以我们可以用递归的思想模拟0-16重循环,分别表示选择翻转的棋子个数。

AC代码

#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
#include<cmath> using namespace std; bool bits[16], flag=false;
inline void resever(int n) {//翻转
int x=n/4,y=n%4;
for (int i=max(0,y-1); i<min(y+2,4); i++)
bits[x*4+i]=!bits[x*4+i];
if (x!=0) bits[(x-1)*4+y]=!bits[(x-1)*4+y];
if (x!=3) bits[(x+1)*4+y]=!bits[(x+1)*4+y];
}
inline bool judge() {//判断是否一致
bool ini=bits[0];
for (int i=1; i<16; i++)
if (ini!=bits[i]) return 0;
return 1;
}
inline void solve(int maxx, int now, int step) {
if (maxx==step) {//翻转完最后一枚棋子
if (judge()) {//满足状态
flag=1;
printf("%d\n",maxx);
}
return ;
}
for (int i=now; i<16; i++) {//从上次翻转位置继续
resever(i);//翻转i
solve(maxx, i+1, step+1);
if (flag) return ;//找到答案,返回
resever(i);//恢复原来状态
}
}
int main() {
char str[4][4];
for (int i=0; i<4; i++) {
cin>>str[i];
for (int j=0; j<4; j++)
bits[i*4+j]=(str[i][j]=='b') ? 1 : 0;
}
for (int i=0; i<=16; i++)//i 为要翻转的棋子个数
solve(i, 0, 0);
if (!flag) printf("Impossible\n");//没有找到答案
return 0;
}

『题解』POJ1753 Flip Game的更多相关文章

  1. 『题解』洛谷P1063 能量项链

    原文地址 Problem Portal Portal1:Luogu Portal2:LibreOJ Portal3:Vijos Description 在\(Mars\)星球上,每个\(Mars\)人 ...

  2. 『题解』Codeforces1142A The Beatles

    更好的阅读体验 Portal Portal1: Codeforces Portal2: Luogu Description Recently a Golden Circle of Beetlovers ...

  3. 『题解』Codeforces1142B Lynyrd Skynyrd

    更好的阅读体验 Portal Portal1: Codeforces Portal2: Luogu Description Recently Lynyrd and Skynyrd went to a ...

  4. 『题解』洛谷P1993 小K的农场

    更好的阅读体验 Portal Portal1: Luogu Description 小\(K\)在\(\mathrm MC\)里面建立很多很多的农场,总共\(n\)个,以至于他自己都忘记了每个农场中种 ...

  5. 『题解』洛谷P2296 寻找道路

    更好的阅读体验 Portal Portal1: Luogu Portal2: LibreOJ Description 在有向图\(\mathrm G\)中,每条边的长度均为\(1\),现给定起点和终点 ...

  6. 『题解』洛谷P1351 联合权值

    更好的阅读体验 Portal Portal1: Luogu Portal2: LibreOJ Description 无向连通图\(\mathrm G\)有\(n\)个点,\(n - 1\)条边.点从 ...

  7. 『题解』Codeforces656E Out of Controls

    更好的阅读体验 Portal Portal1: Codeforces Portal2: Luogu Description You are given a complete undirected gr ...

  8. 『题解』洛谷P2170 选学霸

    更好的阅读体验 Portal Portal1: Luogu Description 老师想从\(N\)名学生中选\(M\)人当学霸,但有\(K\)对人实力相当,如果实力相当的人中,一部分被选上,另一部 ...

  9. 『题解』洛谷P1083 借教室

    更好的阅读体验 Portal Portal1: Luogu Portal2: LibreOJ Portal3: Vijos Description 在大学期间,经常需要租借教室.大到院系举办活动,小到 ...

随机推荐

  1. QCustomPlot 基础

    QCutomPlot简介 官网网址及介绍 https://www.qcustomplot.com/ QCustomPlot is a Qt C++ widget for plotting and da ...

  2. Bribe the Prisoners SPOJ - GCJ1C09C

    Problem In a kingdom there are prison cells (numbered 1 to P) built to form a straight line segment. ...

  3. 基于mosquitto的MQTT客户端实现C语言

    在对MQTT的学习过程中 一下的内容对我提供了帮助 https://www.runoob.com/w3cnote/mqtt-intro.html 对MQTT的入门级介绍 很基础讲解了什么是MQTT h ...

  4. java并发基础及原理

    java并发基础知识导图   一 java线程用法 1.1 线程使用方式 1.1.1 继承Thread类 继承Thread类的方式,无返回值,且由于java不支持多继承,继承Thread类后,无法再继 ...

  5. SystemVerilog Assertion 设计、调试、测试总结(2)

    上一篇博客主要写了SVA的基本语法(详细),这一篇主要写SVA语法总结,以及如何查看SVA波形等. 断言assertion被放在verilog设计中,方便在仿真时查看异常情况.当异常出现时,断言会报警 ...

  6. Java名词术语---持续更新

    在看技术文档的过程中,经常会出现新的java缩写术语,很多时候都不知道它们是什么,在这里记下,持续更新. ——————————————————————————————————————————————— ...

  7. Win10安装虚拟机 + Ubuntu

    近期需要利用虚拟机,同时在虚拟机中安装Ubuntu系统.整理安装过程,供今后学习参考. 虚拟机安装包:VMware-workstation-full-12.1.0 链接:https://pan.bai ...

  8. API---注册表编程

    首先来认识一下键,项,值吧: 左边有五个根键: HKEY_CLASSES_ROOT HKEY_CURRENT_USER HKEY_LOCAL_MACHINE HKEY_USER HKEY_CURREN ...

  9. web安全之php中常见的INI文件配置

    php.ini 在 PHP 启动时被读取.对于服务器模块版本的 PHP,仅在 web 服务器启动时读取 一次.对于 CGI 和 CLI 版本,每次调用都会读取. * Apache web 服务器在启动 ...

  10. 机器学习:weka中添加自己的分类和聚类算法

    不管是实验室研究机器学习算法或是公司研发,都有需要自己改进算法的时候,下面就说说怎么在weka里增加改进的机器学习算法. 一 添加分类算法的流程 1 编写的分类器必须继承 Classifier或是Cl ...