POJ - 3279 枚举 [kuangbin带你飞]专题一
这题很经典啊,以前也遇到过类似的题--计蒜客 硬币翻转。
不过这题不仅要求翻转次数最少,且翻转方案的字典序也要最小。
解法:二进制枚举第一行的翻转方案,然后处理第二行,如果第二行的k列的上一列是黑色,那么第二行k列必须翻转,因为要保证当前行的上一行全为白色。在第一行确定的情况下,当前翻转一定是最优选择。一样的处理方法直到最后一行,最后检查最后一行是否有黑色,如果有说明当前方案无法成功。
PS:枚举第一行是为了解题方便,枚举任何一行都可以,反正每行都能做出最优解。
AC代码
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
using namespace std;
const int maxn = 20;
int G[maxn][maxn], old[maxn][maxn];
int n, m;
const int dx[] = {0,0,-1,1,0};
const int dy[] = {1,-1,0,0,0};
void flip(int x, int y){
for(int i = 0; i < 5; ++i){
int px = x + dx[i], py = y + dy[i];
if(px < 0 || py < 0 || px >= n || py >= m) continue;
G[px][py] = 1 - G[px][py];
}
}
int main(){
while(scanf("%d%d", &n, &m) == 2){
for(int i = 0; i < n; ++i)
for(int j = 0; j < m; ++j){
scanf("%d", &old[i][j]);
}
int ans = 1 << 30, a[maxn][maxn];
//memset(a, 1, sizeof(a));
for(int i = 0; i < (1 << m); ++i){
memcpy(G, old, sizeof(G));
int tp = 0, b[maxn][maxn];
memset(b, 0, sizeof(b));
for(int j = 0; j < m; ++j){
if((1 << j) & i) {
b[0][j] = 1;
++tp;
flip(0, j);
}
}
for(int j = 1; j < n ; ++j) {
for(int k = 0; k < m; ++k){
if(G[j - 1][k] == 1){
tp++;
b[j][k] = 1;
flip(j, k);
}
}
}
int flag = 1;
for(int j = 0; j < m; ++j){
if(G[n-1][j]) {
flag = 0;
break;
}
}
if(flag){
int ok = 0;
if(tp < ans) ok = 1;
else if(tp == ans) {
for(int j = 0; j < n; ++j)
for(int k = 0; k < m; ++k){
if(b[j][k] < a[j][k]) {
ok = 1;
j = n, k = m;
}
else if(b[j][k] > a[j][k]){
j = n, k = m;
}
}
}
if(ok) {
ans = tp;
memcpy(a, b, sizeof(b));
}
}
}
//printf("%d\n", ans);
if(ans == 1 << 30) printf("IMPOSSIBLE\n");
else {
for(int i = 0; i < n; ++i) {
for(int j = 0; j < m; ++j){
if(j == 0) printf("%d", a[i][j]);
else printf(" %d", a[i][j]);
}
printf("\n");
}
}
}
return 0;
}
如有不当之处欢迎指出!
POJ - 3279 枚举 [kuangbin带你飞]专题一的更多相关文章
- POJ - 1321 dfs [kuangbin带你飞]专题一
枚举行和列即可,当前已经放下cnt个棋子,当前已经搜索到第r行,如果 n - r + cnt < k 直接退出,因为后面无法放下剩下的棋子. AC代码 #include<cstdio&g ...
- POJ - 2251 bfs [kuangbin带你飞]专题一
立体bfs,共有六个方向: const int dx[] = {0,0,1,-1,0,0}; const int dy[] = {1,-1,0,0,0,0}; const int dz[] = {0, ...
- POJ - 3087 模拟 [kuangbin带你飞]专题一
模拟洗牌的过程,合并两堆拍的方式:使先取s2,再取s1:分离成两堆的方式:下面C张放到s1,上面C张到s2.当前牌型与第一次相同时,说明不能搜索到答案. AC代码 #include<cstdio ...
- POJ - 3414 bfs [kuangbin带你飞]专题一
状态搜索,每种状态下面共有六种选择,将搜索到的状态保存即可. d[i][j]表示状态A杯中水i升,B杯中水j升,总状态数量不会超过A杯的容量 * B杯的容量. AC代码 #include<cst ...
- POJ - 3984 bfs [kuangbin带你飞]专题一
bfs搜索过程中将路径保存下即可. AC代码 #include<cstdio> #include<cstring> #include<algorithm> #inc ...
- [kuangbin带你飞]专题1-23题目清单总结
[kuangbin带你飞]专题1-23 专题一 简单搜索 POJ 1321 棋盘问题POJ 2251 Dungeon MasterPOJ 3278 Catch That CowPOJ 3279 Fli ...
- 【算法系列学习三】[kuangbin带你飞]专题二 搜索进阶 之 A-Eight 反向bfs打表和康拓展开
[kuangbin带你飞]专题二 搜索进阶 之 A-Eight 这是一道经典的八数码问题.首先,简单介绍一下八数码问题: 八数码问题也称为九宫问题.在3×3的棋盘,摆有八个棋子,每个棋子上标有1至8的 ...
- [kuangbin带你飞]专题一 简单搜索
ID Origin Title 454 / 1008 Problem A POJ 1321 棋盘问题 328 / 854 Problem B POJ 2251 Dungeon Ma ...
- [kuangbin带你飞]专题一 简单搜索(回顾)
A - 棋盘问题 POJ - 1321 注意条件:不能每放一个棋子,就标记一行和一列,我们直接枚举每一行就可以了. AC代码: #include<iostream> #include< ...
随机推荐
- junit4X系列--Builder、Request与JUnitCore
原文出处:http://www.blogjava.net/DLevin/archive/2012/05/12/377957.html.感谢作者的无私分享. 初次用文字的方式记录读源码的过程,不知道怎么 ...
- linkin大话面向对象--java关键字
java中的关键字有以下几个,他们不能作任何其它的用途. 发现没,java中的关键字全是小写,java是严格区分大小写的. abstract default null synchronized ...
- WPF笔记(2.4 Grid)
第一章已经简单介绍过这个容器,这一节详细介绍.Grid一般是用表格(Grid.Row 和Grid.Column )的,比StackPanel更细致一些,但是,这么玩很麻烦,先横着竖着定义一大堆,然后把 ...
- MOOC网视频下载并视频倍速播放,超简单哒,亲测可用,( •̀ ω •́ )y
由于视频在线播放太卡,想着下载看吧~~可是这个坑爹的网站没有下载按钮,难道就不可以下载视频了吗? 小白不甘心~ 于是动手查了一下,实验很成功,估计如果会爬虫的都不用像我一样一个一个自己去下了,奈何我知 ...
- linux下^M问题
^M的原因 Dos.Windows 格式的文件,用 0D 0A (CR+LF)作为换行符 而Unix 的则是以0A(LF) 作为换行符 所以dos 底下的文本文件到了unix的话,换行符就会多出来一个 ...
- Android开发模板代码(二)——为ImageView设置图片,退出后能保存ImageView的状态
接着之前的那个从图库选择图片,设置到ImageView中去,但是,我发现了一个问题,就是再次进入的时候ImageView是恢复到了默认状态,搜索了资料许久之后,终于是发现了解决方法,使用SharePr ...
- bzoj2257: [Jsoi2009]瓶子和燃料
2257: [Jsoi2009]瓶子和燃料 Time Limit: 10 Sec Memory Limit: 128 MB Description jyy就一直想着尽快回地球,可惜他飞船的燃料不够了 ...
- js基本语法与变量
1.//声明变量,js是弱类型语言,变量类型声明示没有意义的.变量类型是随时可以变化的.var a = 1; a = "haha"; a = false;2.注释与 ...
- JavaWeb项目架构之Kafka分布式日志队列
架构.分布式.日志队列,标题自己都看着唬人,其实就是一个日志收集的功能,只不过中间加了一个Kafka做消息队列罢了. kafka介绍 Kafka是由Apache软件基金会开发的一个开源流处理平台,由S ...
- struts2--实现自定义拦截器
前言: 本篇文章,我想说清实现拦截器的办法,还有为什么要这样做: 目录: 1.需求目的 2.实现步骤及原理(文字怕描述不清,画图描述) 3.代码 4.总结 一.需求目的 规范或限制越级访问(例如:一个 ...