题目链接: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. centos Linux下磁盘管理 parted,df ,du,fdisk,partprobe,mkfs.ext4,mount,/etc/fstab,fsck,e2fsck,mk2efs,tmpfs ,nr_inodes, LVM,传统方式扩容文件系统 第七节课

    centos Linux下磁盘管理   parted,df ,du,fdisk,partprobe,mkfs.ext4,mount,/etc/fstab,fsck,e2fsck,mk2efs,tmpf ...

  2. 查看MySQL锁定情况

    SHOW STATUS LIKE '%Table_locks%' Table_locks_immediate | 105         | Table_locks_waited   | 3      ...

  3. MySQL新加用户和开启慢查询

    mysql>grant select on *.* to read@'%' identified by 'j';  //给予read用户只读全部库的权限 mysql>grant selec ...

  4. thinkphp处理jQuery EasyUI form表单问题

    jQuery EasyUI form表单不是ajax方式提交,而是在提交的时候新建一个隐藏的iframe并在iframe里面创建一个与绑定表单一样的表单,然后在iframe里面进行同步提交而不是异步提 ...

  5. Flask系列(二)Flask基础

    知识点回顾 1.flask依赖wsgi,实现wsgi的模块:wsgiref(django),werkzeug(flask),uwsgi(上线) 2.实例化Flask对象,里面是有参数的 app = F ...

  6. 跟我学Makefile(六)

    shell 函数 :和反引号“`”是相同的功能 . shell 函数把执行操作系统命令后的输出作为函数返回. contents := $(shell cat foo) files := $(shell ...

  7. makefile中ifeq与ifneq dev/null和dev/zero简介 dd命令

    ifeq语法是ifeq "<arg1>;" "<arg2>;"  ,功能是比较参数“arg1”和“arg2”的值是否相同,相同时为1 i ...

  8. POJ2992:Divisors(求N!因子的个数,乘性函数,分解n!的质因子(算是找规律))

    题目链接:http://poj.org/problem?id=2992 题目要求:Your task in this problem is to determine the number of div ...

  9. 牛客国庆集训派对Day5 Solution

    A    璀璨光滑 留坑. B    电音之王 蒙特马利大数乘模运算 #include <bits/stdc++.h> using namespace std; typedef long ...

  10. RESTful源码学习笔记之RPC和 RESTful 什么区别

    REST,即Representational State Transfer的缩写.翻译过来是表现层状态转换.如果一个架构符合REST原则,就称它为RESTful架构.啥叫json-rpc?接口调用通常 ...