POJ 3279 Filptile dfs
题目链接: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的更多相关文章
- 【枚举】POJ 3279
直达–>POJ 3279 Fliptile 题意:poj的奶牛又开始作孽了,这回他一跺脚就会让上下左右的砖块翻转(1->0 || 0->1),问你最少踩哪些砖块才能让初始的砖块全部变 ...
- POJ 3279(Fliptile)题解
以防万一,题目原文和链接均附在文末.那么先是题目分析: [一句话题意] 给定长宽的黑白棋棋盘摆满棋子,每次操作可以反转一个位置和其上下左右共五个位置的棋子的颜色,求要使用最少翻转次数将所有棋子反转为黑 ...
- POJ 3279 Fliptile(翻格子)
POJ 3279 Fliptile(翻格子) Time Limit: 2000MS Memory Limit: 65536K Description - 题目描述 Farmer John kno ...
- POJ.3279 Fliptile (搜索+二进制枚举+开关问题)
POJ.3279 Fliptile (搜索+二进制枚举+开关问题) 题意分析 题意大概就是给出一个map,由01组成,每次可以选取按其中某一个位置,按此位置之后,此位置及其直接相连(上下左右)的位置( ...
- POJ.3172 Scales (DFS)
POJ.3172 Scales (DFS) 题意分析 一开始没看数据范围,上来直接01背包写的.RE后看数据范围吓死了.然后写了个2^1000的DFS,妥妥的T. 后来想到了预处理前缀和的方法.细节以 ...
- 状态压缩+枚举 POJ 3279 Fliptile
题目传送门 /* 题意:问最少翻转几次使得棋子都变白,输出翻转的位置 状态压缩+枚举:和之前UVA_11464差不多,枚举第一行,可以从上一行的状态知道当前是否必须翻转 */ #include < ...
- POJ 3279 Fliptile(DFS+反转)
题目链接:http://poj.org/problem?id=3279 题目大意:有一个n*m的格子,每个格子都有黑白两面(0表示白色,1表示黑色).我们需要把所有的格子都反转成黑色,每反转一个格子, ...
- POJ 3279 Fliptile (dfs+二进制)
Description Farmer John knows that an intellectually satisfied cow is a happy cow who will give more ...
- ACM : POJ 2676 SudoKu DFS - 数独
SudoKu Time Limit:2000MS Memory Limit:65536KB 64bit IO Format:%lld & %llu POJ 2676 Descr ...
随机推荐
- scrapy爬虫系列之五--CrawlSpider的使用
功能点:CrawlSpider的基本使用 爬取网站:保监会 主要代码: cf.py # -*- coding: utf-8 -*- import scrapy from scrapy.linkextr ...
- 洛谷P2325王室联邦 SCOI2005 构造+树上分块
正解:构造 解题报告: 照例先放传送门 umm其实我jio得这题应该在教树上莫队的时候港,应该是用来帮助理解树上莫队的分块方式的 然而这题是在学了树上分块之后再遇到的?就显得没那么难了吼 然后就随便说 ...
- thinkcmf安装教程与目录结构详解 快速上手版
最近接了一个建站项目,要求用thinkcmf来搭建,ytkah在想php都大致一样吧,快速地下载安装包,可是!怎么安装呢?没看到安装指引文件或目录,查看了安装说明public目录做为网站根目录,入口文 ...
- Java-idea-常用技巧-转maven,解决包依赖冲突
1.Intellij IDEA如何将普通工程转换成maven工程 项目上右键 Add Framework Support,选择maven 2.Intellij IDEA 自动生成 serialVers ...
- Laravel 5.* 中路由绑定 Controller 包含子目录写法
https://blog.csdn.net/maxsky/article/details/54017981 [可以使用命令在项目根目录一键创建 php artisan make:controller ...
- nmon 命令
nmon 命令 用途 以交互方式显示本地系统统计信息并以记录方式记录系统统计信息. 语法 交互方式: nmon [ -h ] nmon [ -s < seconds >] [ -c < ...
- 92. Reverse Linked List II(链表部分反转)
Reverse a linked list from position m to n. Do it in-place and in one-pass. For example:Given 1-> ...
- 如何使用iClap创建普通批注
iClap是一款以产品管理为基础的企业协同办公软件,其中智能批注为其产品管理的核心工具,我们可以以图片,文字和视频的形式创建批注.本文为大家介绍的是如何在iClap上创建普通批注(图片,文字形式). ...
- 【android】开发笔记系列:行为篇
1:键盘遮挡了输入框 在androidManifest.xml里,对应的activity里设置键盘模式 <activity android:name="活动名称" andro ...
- C# static的用法详解
C# static的用法详解 有的东西你天天在用,但未必就代表你真正了解它,正如我之前所了解的 static . 一.静态类 静态类与非静态类的重要区别在于静态类不能实例化,也就是说,不能使用 n ...