题目链接:http://poj.org/problem?id=3279

大意:给出一块n*m的棋盘。里面放满了棋子。有1和0两种状态。给出初始状态,翻动的时候会把当前位置和当前位置的上下左右共五个位置翻动。现在问最小步骤的翻动方案。步  骤数相同时按照字典序输出。(输出按照n*m的形式输出每个格子的翻动次数)

其中!字典序的意思是每行首尾相接连成的字符串排序。亲测和顺序有关。

改了字典序之后,测试无数次找到神奇的bug就是string字符串的初始化。2333。

其实感觉不是dfs,至少对我来说就是一个二进制枚举+search的过程。不如说是暴力search?

附代码,已AC。

 // 我想说我不会这个题。开始的时候是感觉每个格子搜一遍的超暴力dfs 我是可以的。然后呢。一定会超时的。恩。
// 然后先确定第一行的操作就可以确定第二行的操作了?恩。因为我第二行肩负着让第一行全部为0的使命。
// 不能随便动、必须和第一行完全对应。依次类推。知道最后一行都是确定的。然后、
// 如果最后一行的操作同时使最后一行全部变成0了。就是可行方案。否则不是。
// QAQ。然而纠结了半天新的问题是怎么代码实现呢。恩。第一行的操作遍历可以抽象成一个10进制数0到(2^n-1)的变换、
// 然后每次都按行搜索下去。好了。具体的看代码吧。。QAQ、 #include <stdio.h>
#include <string.h>
#include <iostream>
#define maxn 10000010
#include <algorithm>
using namespace std; int m, n;
int mp[][];
int num[][];
int ans;
int mpcpy[][];
int cnt; int dir[][] = {, , -, , , , , -, , };
int ansnum[][];
string ans2[]; int pow(int n) {
int temp = ;
for (int i=; i<n; ++i) {
temp *= ;
}
return temp;
} bool check(int x, int y) {
if (x >= && x < m && y >= && y < n)
return true;
return false;
} void filp(int ii, int jj) {
for (int i=; i<; ++i) {
int x = ii + dir[i][];
int y = jj + dir[i][];
if (check(x, y))
mpcpy[x][y] = - mpcpy[x][y];
}
} int min(int a, int b) {
if (a < b) return a;
else return b;
} int dfs() {
int tempans = ;
for (int i=; i<m; ++i) {
for (int j=; j<n; ++j) {
mpcpy[i][j] = mp[i][j];
}
} for (int i=; i<n; ++i) {
if (num[][i] == ) {
tempans++;
filp(, i);
}
} for (int i=; i<m-; ++i) {
for (int j=; j<n; ++j) {
if (mpcpy[i][j] == ) {
tempans++;
num[i+][j] = ;
filp(i+, j);
}
}
} for (int i=; i<m; ++i) {
for (int j=; j<n; ++j)
if (mpcpy[i][j] == )
return maxn;
}
return tempans;
} int main() {
while(cin >> m >> n) {
for (int i=; i<m; ++i) {
for (int j=; j<n; ++j) {
cin >> mp[i][j];
}
}
int temp = ;
int tempmax = pow(n+) - ;
ans = maxn;
cnt = ;
while(temp < tempmax) {
memset(num, , sizeof(num));
string anstemp = "";
int temp2 = temp;
for (int i=; i<n; ++i) {
num[][i] = temp2 % ;
temp2 /= ;
}
temp++; if (ans > dfs()) {
ans = dfs();
for (int i=; i<m; ++i) {
for (int j=; j<n; ++j) {
anstemp += '' + num[i][j];
}
}
ans2[cnt++] = anstemp;
}
} if (ans == maxn) {
cout << "IMPOSSIBLE\n";
continue;
}
sort(ans2, ans2+cnt);
int tt = ;
for (int i=; i<m; ++i) {
for (int j=; j<n; ++j) {
if (j == ) cout << ans2[][tt++];
else cout << ' ' << ans2[][tt++];
}
cout << endl;
}
}
return ;
}

我想说这个题在毫无思路的情况下,被小王sir告知思路,然后,尝试代码实现写出来的。感觉自己好厉害【傲娇脸】。第一行的枚举用十进制数的二进制形式表示。记录最终答案的过程。啊哈。以上。

POJ 3279 Filptile dfs的更多相关文章

  1. 【枚举】POJ 3279

    直达–>POJ 3279 Fliptile 题意:poj的奶牛又开始作孽了,这回他一跺脚就会让上下左右的砖块翻转(1->0 || 0->1),问你最少踩哪些砖块才能让初始的砖块全部变 ...

  2. POJ 3279(Fliptile)题解

    以防万一,题目原文和链接均附在文末.那么先是题目分析: [一句话题意] 给定长宽的黑白棋棋盘摆满棋子,每次操作可以反转一个位置和其上下左右共五个位置的棋子的颜色,求要使用最少翻转次数将所有棋子反转为黑 ...

  3. POJ 3279 Fliptile(翻格子)

    POJ 3279 Fliptile(翻格子) Time Limit: 2000MS    Memory Limit: 65536K Description - 题目描述 Farmer John kno ...

  4. POJ.3279 Fliptile (搜索+二进制枚举+开关问题)

    POJ.3279 Fliptile (搜索+二进制枚举+开关问题) 题意分析 题意大概就是给出一个map,由01组成,每次可以选取按其中某一个位置,按此位置之后,此位置及其直接相连(上下左右)的位置( ...

  5. POJ.3172 Scales (DFS)

    POJ.3172 Scales (DFS) 题意分析 一开始没看数据范围,上来直接01背包写的.RE后看数据范围吓死了.然后写了个2^1000的DFS,妥妥的T. 后来想到了预处理前缀和的方法.细节以 ...

  6. 状态压缩+枚举 POJ 3279 Fliptile

    题目传送门 /* 题意:问最少翻转几次使得棋子都变白,输出翻转的位置 状态压缩+枚举:和之前UVA_11464差不多,枚举第一行,可以从上一行的状态知道当前是否必须翻转 */ #include < ...

  7. POJ 3279 Fliptile(DFS+反转)

    题目链接:http://poj.org/problem?id=3279 题目大意:有一个n*m的格子,每个格子都有黑白两面(0表示白色,1表示黑色).我们需要把所有的格子都反转成黑色,每反转一个格子, ...

  8. POJ 3279 Fliptile (dfs+二进制)

    Description Farmer John knows that an intellectually satisfied cow is a happy cow who will give more ...

  9. ACM : POJ 2676 SudoKu DFS - 数独

    SudoKu Time Limit:2000MS     Memory Limit:65536KB     64bit IO Format:%lld & %llu POJ 2676 Descr ...

随机推荐

  1. Struts2表单数据接收方式

    版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/sunshoupo211/article/details/30249239 1.将Action类作 ...

  2. 从WW中剥离一个三维场景框架

    从WW中剥离一个三维场景框架,初步实现的一个.可以绘制一个三角形,但是不能够控制摄像机,没有增加鼠标事件.没有投影,世界变幻之类的东西.以后会不断学习逐步增加进来. 下载地址 下载V1.0.0.2

  3. 详谈LABJS按需动态加载js文件

    为了提高页面的打开和加载速度,我们经常把JS文件放在页面的尾部,但是有些JS必须放在页面前面,这样就会增加页面的加载时间:于是出现了按需动态加载的概念,这个概念就是当页面需要用到这个JS文件或者CSS ...

  4. CentOS 7 集群使用NTP进行时间同步

    NTP时钟同步方式说明NTP在linux下有两种时钟同步方式,分别为直接同步和平滑同步: 直接同步 使用ntpdate命令进行同步,直接进行时间变更.如果服务器上存在一个12点运行的任务,当前服务器时 ...

  5. SCons构建工具使用

    scons是一个Python写的自动化构建工具,和GNU make相比优点明显:    1. 移植性:python能运行的地方,就能运行scons    2. 扩展性:理论上scons只是提供了pyt ...

  6. array2xml xml2array

    array2xml/**     *     * 将简单数组转化为简单的xml     * @param string $data  要进行转化的数组     * @param string $tag ...

  7. 3.8 Templates -- Actions

    一.The {{action}} Helper 你的应用程序通常会需要一种方法来让用户用控件交互改变应用程序状态. 例如,你有一个显示blog post的模板,并支持用额外的信息扩展post. 可以使 ...

  8. 3.9 Templates -- Input Helpers

    一.Input Helpers Ember中{{input}}和{{textarea}}是创建常规表单控件最简单的方法. {{input}}包裹内建的Ember.TextField和Ember.Che ...

  9. virtulenv使用

    windows下创建虚拟环境 安装 virtualenv pip3 install virtualenv #选择一个存放虚拟环境的文件夹 cmd中 d: mkdir xxx cd xxx # 创建虚拟 ...

  10. 2.JVM运行机制 -- JVM序列

    上一次写了1.初步认识JVM -- JVM序列,今天接着记录写JVM的运行机制. 一.JVM启动流程 Java平台包括JVM以及Java语言,其中JVM也是运行在操作系统中的一个应用程序进程,那么也应 ...