这题很经典啊,以前也遇到过类似的题--计蒜客 硬币翻转。

不过这题不仅要求翻转次数最少,且翻转方案的字典序也要最小。

解法:二进制枚举第一行的翻转方案,然后处理第二行,如果第二行的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带你飞]专题一的更多相关文章

  1. POJ - 1321 dfs [kuangbin带你飞]专题一

    枚举行和列即可,当前已经放下cnt个棋子,当前已经搜索到第r行,如果 n - r + cnt  < k 直接退出,因为后面无法放下剩下的棋子. AC代码 #include<cstdio&g ...

  2. 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, ...

  3. POJ - 3087 模拟 [kuangbin带你飞]专题一

    模拟洗牌的过程,合并两堆拍的方式:使先取s2,再取s1:分离成两堆的方式:下面C张放到s1,上面C张到s2.当前牌型与第一次相同时,说明不能搜索到答案. AC代码 #include<cstdio ...

  4. POJ - 3414 bfs [kuangbin带你飞]专题一

    状态搜索,每种状态下面共有六种选择,将搜索到的状态保存即可. d[i][j]表示状态A杯中水i升,B杯中水j升,总状态数量不会超过A杯的容量 * B杯的容量. AC代码 #include<cst ...

  5. POJ - 3984 bfs [kuangbin带你飞]专题一

    bfs搜索过程中将路径保存下即可. AC代码 #include<cstdio> #include<cstring> #include<algorithm> #inc ...

  6. [kuangbin带你飞]专题1-23题目清单总结

    [kuangbin带你飞]专题1-23 专题一 简单搜索 POJ 1321 棋盘问题POJ 2251 Dungeon MasterPOJ 3278 Catch That CowPOJ 3279 Fli ...

  7. 【算法系列学习三】[kuangbin带你飞]专题二 搜索进阶 之 A-Eight 反向bfs打表和康拓展开

    [kuangbin带你飞]专题二 搜索进阶 之 A-Eight 这是一道经典的八数码问题.首先,简单介绍一下八数码问题: 八数码问题也称为九宫问题.在3×3的棋盘,摆有八个棋子,每个棋子上标有1至8的 ...

  8. [kuangbin带你飞]专题一 简单搜索

            ID Origin Title 454 / 1008 Problem A POJ 1321 棋盘问题   328 / 854 Problem B POJ 2251 Dungeon Ma ...

  9. [kuangbin带你飞]专题一 简单搜索(回顾)

    A - 棋盘问题 POJ - 1321 注意条件:不能每放一个棋子,就标记一行和一列,我们直接枚举每一行就可以了. AC代码: #include<iostream> #include< ...

随机推荐

  1. Maven以及在Maven在Myeclipse中的配置

    一.maven安装与配置1.到官网http://maven.apache.org/download.cgi下载maven压缩包,解压到指定文件夹.如:D:\apache-maven-3.3.92.添加 ...

  2. 转-WebService到底是什么?

    原文链接:WebService到底是什么? 一.序言 大家或多或少都听过WebService(Web服务),有一段时间很多计算机期刊.书籍和网站都大肆的提及和宣传WebService技术,其中不乏很多 ...

  3. Linux指令--chmod

    chmod命令用于改变linux系统文件或目录的访问权限.用它控制文件或目录的访问权限.该命令有两种用法.一种是包含字母和操作符表达式的文字设定法:另一种是包含数字的数字设定法. Linux系统中的每 ...

  4. 清除Chrome浏览器的历史记录、缓存

    习惯了用360卫士清理浏览器缓存.历史记录等垃圾文件,但是今天用360清理过后,打开谷歌浏览器Chrome时, 发现它的历史记录(CTRL+ H)根本没有被清理掉,经过一番探索后,可以通过下面方法清除 ...

  5. Css3颜色值RGBA得表示方式

    RGBA(R,G,B,A) 取值 R:红色值.正整数 | 百分数 G:绿色值.正整数 | 百分数 B:蓝色值.正整数 | 百分数 A:Alpha透明度.取值0~1之间. 说明: RGBA记法. 此色彩 ...

  6. C# 类型基础(下)

    前面介绍了基本的类型,接下来我们讲讲类型的转换 值类型的两种表现形式:未装箱和已装箱 ,而引用类型总是处于装箱形式 int count = 10; object obj = count; 装箱:值类型 ...

  7. HARBOR 仓库 API功能接口

    1       项目管理 1.1     查看仓库中项目详细信息 curl -u "admin:Harbor12345" -X GET -H "Content-Type: ...

  8. 从零开始学习前端JAVASCRIPT — 10、JavaScript基础ES6(ECMAScript6.0)

    ECMAScript 6.0(简称ES6)是JavaScript语言的下一代标准,已经在2015年6月正式发布了.它的目标,是使得JavaScript语言可以用来编写复杂的大型应用程序,成为企业级开发 ...

  9. python的组合数据类型及其内置方法说明

    python中,数据结构是通过某种方式(例如对元素进行编号),组织在一起数据结构的集合. python常用的组合数据类型有:序列类型,集合类型和映射类型 在序列类型中,又可以分为列表和元组,字符串也属 ...

  10. CentOS安装scp命令

    scp这东西应该属于openssh-clients这个包,运行: yum -y install openssh-clients 再运行scp就可以了,再次运行: .txt 注意,scp 命令操作的两端 ...