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 ...
随机推荐
- sailsjs入门到精通(一)
sailsjs 官方网站http://sailsjs.com/ 中文网站: http://sailsdoc.swift.ren/ 1 全局安装sails npm install sails@bet ...
- 【Python】如何取到input中的value值?
练习:取到下方链接下所有海贼王的下载链接. # coding=utf-8 from selenium import webdriver from time import sleep import ke ...
- 《Java程序猿面试笔试宝典》之Java程序初始化的顺序是如何的
在Java语言中.当实例化对象时.对象所在类的全部成员变量首先要进行初始化,仅仅有当全部类成员完毕初始化后,才会调用对象所在类的构造函数创建对象. Java程序的初始化一般遵循以下三个原则(以下 ...
- input输入框type=file时accept中可以限制的文件类型(转载)
转载自: input type=file accept中可以限制的文件类型 在上传文件的时候,需要限制指定的文件类型. <input type="file" accept=& ...
- 关于c语言struct和typedef
C++中使用: struct test{ int x, y;};就可以定义一个名为 test的结构体,但C中很可能编译通不过.C语言并不支持在struct后使用标示符定义结构体的名字,test将 ...
- 文件下载—SSH框架文件下载
1.准备下载的api组件 <dependency> <groupId>commons-io</groupId> <artifactId>commons- ...
- ruby中的win32ole使用
ruby中的win32ole是一个标准库,使用的时候只要添加require 'win32ole'就行. 下面是一段模拟一个登陆的代码 require 'win32ole' ie = WIN32OLE. ...
- this指向 - 开端
/* 这个主题 主要是为了论述 js 中一个最烦人的问题 --> this 的指向问题 其实,这个 this 到底指向什么,指向谁,查了好多资料.书籍.官文,也没有给出明确的一个结论, 也学这也 ...
- CentOS下 Nginx1.13.5 + PHP7.1.10 + MySQL5.7.19 源码编译安装
一.安装Nginx ①安装依赖扩展 # yum -y install wget openssl* gcc gcc-c++ autoconf libjpeg libjpeg-devel libpng l ...
- Sublime Text 3 配置Python3.x
Sublime Text 3 配置Python3.x 一.Package Control 安装: 1,通过快捷键 ctrl+` 或者 View > Show Console 打开控制台,然后粘贴 ...