POJ3276——暴力——Fliptile

http://poj.org/problem?id=3279

/*
枚举第一行所有的状态,接下来的行都已经确定了,字典序最小输出
 */
/************************************************
* Author        :Powatr
* Created Time  :2015-8-9 13:18:38
* File Name     :D.cpp
 ************************************************/

#include <cstdio>
#include <algorithm>
#include <iostream>
#include <sstream>
#include <cstring>
#include <cmath>
#include <string>
#include <vector>
#include <queue>
#include <deque>
#include <stack>
#include <list>
#include <map>
#include <set>
#include <bitset>
#include <cstdlib>
#include <ctime>
using namespace std;

#define lson l, mid, rt << 1
#define rson mid + 1, r, rt << 1 | 1
typedef long long ll;
const int MAXN = 1e5 + 10;
const int INF = 0x3f3f3f3f;
const int MOD = 1e9 + 7;

int n, m;
char s[400];
char ss[400];
int  maze[20][20];
int mp[20][20];
int path[20][20];
int f_path[20][20];

int solve(int cnt)
{
    int  ans = 0;
    for(int i = 1; i <= n; i++)
        for(int j = 1; j <= m; j++)
            mp[i][j] = maze[i][j];
    for(int i = 1; i <= m; i++){
        if(cnt&(1<<(i-1))){
            ans++;
            path[1][i] ^= 1;
            mp[1][i] ^= 1;
            mp[1][i-1] ^= 1;
            mp[1][i+1] ^= 1;
            mp[2][i] ^= 1;
        }
    }
    for(int i = 2; i <= n;i++){
        for(int j = 1; j <= m; j++){
            if(mp[i-1][j] == 1){
                ans++;
                path[i][j] ^= 1;
                mp[i-1][j] ^= 1;
                mp[i][j] ^= 1;
                mp[i][j-1] ^= 1;
                mp[i][j+1] ^= 1;
                mp[i+1][j] ^= 1;
            }
        }
    }
       for(int j = 1; j <= m; j++)
           if(mp[n][j])
               return -1;
   return ans;
}

int main(){
    while(~scanf("%d%d", &n, &m)){
        for(int i = 1; i <= n; i++){
            for(int j = 1; j <= m; j++)
                scanf("%d", &maze[i][j]);
            }
        memset(f_path, 0 , sizeof(f_path));
        for(int i = 1; i <= n*m ; i++)
            ss[i] = ‘1‘;
        int min1 = n*m + 1;
        for(int i = 0; i <= (1<<n) - 1; i++){
            int res = 0;
            memset(path, 0, sizeof(path));
            memset(mp, 0, sizeof(mp));
            int temp = solve(i);
            if(temp == -1) continue;
            if(temp <= min1) {
                min1 = temp;
                for(int i = 1; i <= n; i++){
                    for(int j = 1; j <= m; j++){
                        s[++res] = (char)(path[i][j] + ‘0‘);
                    }
                }
                if(strcmp(s+1, ss+1) < 0){
                    strcpy(ss+1, s+1);
                }
            }
        }
        if(min1 == n*m + 1)
            printf("IMPOSSIBLE\n");
        else {
            for(int i = 1; i <= n*m; i++){
                printf("%c%c", ss[i], i % m == 0 ? ‘\n‘ : ‘ ‘);
            }
        }
    }
    return 0;
}

  

时间: 2024-10-05 23:25:35

POJ3276——暴力——Fliptile的相关文章

poj 3279 Fliptile(二进制暴力)

Fliptile Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 3629   Accepted: 1400 Description Farmer John knows that an intellectually satisfied cow is a happy cow who will give more milk. He has arranged a brainy activity for cows in which

1647: [Usaco2007 Open]Fliptile 翻格子游戏

1647: [Usaco2007 Open]Fliptile 翻格子游戏 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 423  Solved: 173[Submit][Status][Discuss] Description Farmer John knows that an intellectually satisfied cow is a happy cow who will give more milk. He has arranged a

小结:暴力

概要: 所谓大力出奇迹. 技巧及注意: 技巧太多..否则为嘛出暴力题给你.. 在一次cf比赛中Codeforces Round #266 (Div. 2),A.B题都是暴力QAQ,表示我是蒟蒻..然后赛后膜拜了tourist的大腿,原来是暴力. 总结起来就是,在只有2种互相约束(或许更多?)的答案时,我们可以枚举其中一个,然后用和或者啥的得出另一个,然后更新即可. 还有就是可以以某种情况下根据约束直接推出其它状态,然后暴力枚举第一种情况即可,例如:[BZOJ]1647: [Usaco2007 O

POJ 3279(Fliptile)题解

以防万一,题目原文和链接均附在文末.那么先是题目分析: [一句话题意] 给定长宽的黑白棋棋盘摆满棋子,每次操作可以反转一个位置和其上下左右共五个位置的棋子的颜色,求要使用最少翻转次数将所有棋子反转为黑色所需翻转的是哪些棋子(这句话好长...). [题目分析] 盯着奇怪的题目看了半天发现和奶牛没什么卵关系..奶牛智商高了产奶高是什么鬼说法... 这题刚开始被放到搜索的分类下了..然而这和搜索有什么关系..没经验所以想了各种和搜索沾边的方法,结果没想出解法,直到看了网上的题解,压根不是搜索啊有木有.

【反转】POJ3276

Face The Right Way 题意:N个牛 每个都有一定的方向 B背对 F表示头对着你 给你一个装置 每次可以选择连续的K个牛反转方向 问你如何选择K 使得操作数最少 k也应尽量小. 例子:   N=7   BBFBFBB   (F:前面   B:后面)    (红色的为要反转的)   此出K=3  M=3 B B F B F B B F F B B F B B F F F F B B B F F F F F F F   成功了 如果用暴力的方法的话:   考虑N头牛的话最坏情况下要进行

Fliptile(POJ 3279)

原题如下: Fliptile Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 16494   Accepted: 6025 Description Farmer John knows that an intellectually satisfied cow is a happy cow who will give more milk. He has arranged a brainy activity for cows i

二叉树的后序遍历(暴力版) 小白菜oj 1034

给出二叉树的前序遍历和中序遍历,求二叉树的后序遍历-- 作为一个搜索蒟蒻,我真的没有办法很和谐的A掉,但估计过几天就会写有关这个题的和谐的解法--但只是估计-- 下面讲述我的超暴力解法-- 首先,先由前序遍历得到一个父亲节点,然后再由中序遍历得到这个父亲节点的左子树和右子树中的元素(中序遍历中,该点的左边的所有点,都在它的左子树,右边的都在它的右子树,子树中的根节点是在这些节点的前序遍历中排名最靠前的),然后递归建树,之后在递归求后序遍历即可. 但这个方法有两个比较--&¥--&的问题:1

玲珑杯 round18 A 计算几何瞎暴力

题目链接 : http://www.ifrog.cc/acm/problem/1143 当时没看到坐标的数据范围= =看到讨论才意识到,不同的坐标最多只有1k多个,完全可以暴力做法,不过也要一些技巧. 首先注意数很大可能爆int,用LL得话注意强制转换或者全设为LL,假如  int a=50000,b=a;  LL sum=a*b; 则会爆出,除非ab都是LL 或者 sum=(LL)a*(LL)b; 还有就是R最大就是30,我们不妨设ans[i]表示R<=i的组合个数,做一个前缀和方便快速询问.

Vijos P1066 弱弱的战壕【多解,线段树,暴力,树状数组】

弱弱的战壕 描述 永恒和mx正在玩一个即时战略游戏,名字嘛~~~~~~恕本人记性不好,忘了-_-b. mx在他的基地附近建立了n个战壕,每个战壕都是一个独立的作战单位,射程可以达到无限(“mx不赢定了?!?”永恒[email protected][email protected]). 但是,战壕有一个弱点,就是只能攻击它的左下方,说白了就是横纵坐标都不大于它的点(mx:“我的战壕为什么这么菜”ToT).这样,永恒就可以从别的地方进攻摧毁战壕,从而消灭mx的部队. 战壕都有一个保护范围,同它的攻击