题目链接: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. rbac - 初识

    一.rbac 权限组件 1 项目与应用 一个项目,可以有多个应用 一个应用,可以在多个项目下 前提:应用是组件!! 2 什么是权限? 一个包含正则表达式url就是一个权限 who what how - ...

  2. KVM中断虚拟化浅析

    2017-08-24 今天咱们聊聊KVM中断虚拟化,虚拟机的中断源大致有两种方式,来自于用户空间qemu和来自于KVM内部. 中断虚拟化起始关键在于对中断控制器的虚拟化,中断控制器目前主要有APIC, ...

  3. 第1章 1.10计算机网络概述--OSI参考模型和TCP_IP协议

    传输层负责将大数据文件分段,变成数据段. 网络层负责为小分段加上IP地址,变成数据包. 数据链路层负责将数包加上MAC地址和校验值,变成数据帧. TCP/IP协议是一群协议.不只是2个协议.

  4. git-【二】本地git操作提交、版本回退

    一.创建版本库,提交文件 什么是版本库?版本库又名仓库,英文名repository,你可以简单的理解一个目录,这个目录里面的所有文件都可以被Git管理起来,每个文件的修改,删除,Git都能跟踪,以便任 ...

  5. Centos7使用yum下载rpm包而不执行安装

    yum-downloadonly是yum的一个插件,使得yum可以从RHN或者yum的仓库只下载包而不安装. 举例,从yum源下载ricci软件包 # yum install --downloadon ...

  6. POJ2186:Popular Cows(tarjan+缩点)

    题目解析: 这题题意没什么好说的,解法也挺简单的,只要会tarjan算法+只有一个出度为0的强连通分量题目有解这题就迎刃而解了. #include <iostream> #include ...

  7. PAT 1139 First Contact[难][模拟]

    1139 First Contact(30 分) Unlike in nowadays, the way that boys and girls expressing their feelings o ...

  8. 1linux的基本命令

    查看命令的帮助信息man 命令名 文件操作touch 建立文件 (对于已存在文件,更新时间)cat 查看文件 (-n 自动加上行号)rm 删除文件cp 拷贝文件mv 移动/重命名文件more 分页查看 ...

  9. How to install tensorflow on ubuntu 18.04 64bit

    Ans:pip install tensorflow (note:  version number of pip and python must be  consistent)

  10. Flask 5 模板1

    NOTE 1.VF的作用:生成请求的响应.一般来说请求会改变程序的状态,这种变化会在视图函数中产生. eg.用户在网站中注册了一个新账户,用户在表单中输入电子邮件地址和密码,然后提交到服务器,服务器接 ...