POJ3279 搜索/思维

Fliptile

Time Limit: 2000MS   Memory Limit: 65536K
Total Submissions: 10457   Accepted: 3866

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 they manipulate an M × N grid (1 ≤ M ≤ 15; 1 ≤ N ≤ 15) of square tiles, each of which is colored black on one side and white on the other side.

As one would guess, when a single white tile is flipped, it changes to black; when a single black tile is flipped, it changes to white. The cows are rewarded when they flip the tiles so that each tile has the white side face up. However, the cows have rather large hooves and when they try to flip a certain tile, they also flip all the adjacent tiles (tiles that share a full edge with the flipped tile). Since the flips are tiring, the cows want to minimize the number of flips they have to make.

Help the cows determine the minimum number of flips required, and the locations to flip to achieve that minimum. If there are multiple ways to achieve the task with the minimum amount of flips, return the one with the least lexicographical ordering in the output when considered as a string. If the task is impossible, print one line with the word "IMPOSSIBLE".

Input

Line 1: Two space-separated integers: M and N
Lines 2..M+1: Line i+1 describes the colors (left to right) of row i of the grid with N space-separated integers which are 1 for black and 0 for white

Output

Lines 1..M: Each line contains N space-separated integers, each specifying how many times to flip that particular location.

Sample Input

4 4
1 0 0 1
0 1 1 0
0 1 1 0
1 0 0 1

Sample Output

0 0 0 0
1 0 0 1
1 0 0 1
0 0 0 0

Source

USACO 2007 Open Silver

只要枚举第一行的格子的翻转情况,然后下面的行数翻转使得上面的格子变为白色,枚举完之后前(n-1)行一定全白,只要检查最后一行就ok

看的题解的思路自己没想到这样写哎

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
#define inf 0x3f3f3f3f
int N,M;
int e1[20][20];
int e2[20][20];
int tim[20][20];
int an[20][20];
bool e3[20];
int ans=inf;
int fx[4][2]={1,0,-1,0,0,1,0,-1};
void turn(int x,int y)
{
    e2[x][y]=(e2[x][y]==0?1:0);
    for(int i=0;i<4;++i){
        int dx=x+fx[i][0];
        int dy=y+fx[i][1];
         if(dx<1||dy<1||dx>N||dy>M) continue;
                 e2[dx][dy]=(e2[dx][dy]==0?1:0);
    }
}
void make()
{
  int i,j;
  for(i=2;i<=N;++i){
    for(j=1;j<=M;++j){
        int up=e2[i-1][j];
        if(up==0) continue;
        else{
           turn(i,j);
           tim[i][j]++;
        }
    }
  }int s=0;
  for(i=1;i<=M;++i) if(e2[N][i]==0) s++;

if(s==M){
    s=0;

for(i=1;i<=N;++i){
        for(j=1;j<=M;++j) {
                s+=tim[i][j];
       // cout<<tim[i][j];
       // if(j!=M) cout<<" ";
        }
        //cout<<endl;
    }

if(s<ans){
        ans=s;
        memcpy(an,tim,sizeof(int)*400);
    }
  }
}
void solve()
{
   int i,j,k;
   memcpy(e2,e1,sizeof(int)*400);
   memset(tim,0,sizeof(tim));
   for(i=1;i<=M;++i){
    if(e3[i]){
        turn(1,i);
        tim[1][i]++;
    }
   }
   make();
}
void dfs(int x)
{
  if(x==M+1){
    solve();
    return;
  }
  for(int i=0;i<2;++i){
    e3[x]=i;
    dfs(x+1);
  }
}
int main()
{
    int i,j,k;
    while(cin>>N>>M){ans=inf;
        for(i=1;i<=N;++i)
            for(j=1;j<=M;++j) {
                    cin>>e1[i][j];
            }
        dfs(1);
        if(ans==inf) puts("IMPOSSIBLE");
        else{
            for(i=1;i<=N;++i){
                for(j=1;j<=M;++j){
                    if(j!=1) cout<<" ";
                    cout<<an[i][j];
                }
                cout<<endl;
            }
        }
    }
    return 0;
}

时间: 2024-12-17 11:01:56

POJ3279 搜索/思维的相关文章

poj3279搜索详解

这道搜索题和大部分的题都不太一样,没有一个明显的思路,格子间的状态都是互相影响的,只能通过枚举第一行,逐行往下搜. 详解: 1.如何搜索:如果从上到下搜索,当前行是否需要反转取决于上一行的状态,通过翻转当前行使上一行为0,而不是通过上一行翻转为0后,看当前行的状态判断自己是否需要翻转,否则还会继续影响上一行.所以枚举一下第一行所有的状态,搜索到最后一行结束,如果可以保证最后一行都是0,那么方案可以,否则重新定义第一行的状态,继续搜索,找出使反转次数最少的方案. 2.保证字典序最小:按照字典序从小

D - Fliptile POJ3279 搜索(反转开关经典问题,二进制表示集合)

D - Fliptile Time Limit:2000MS Memory Limit:65536KB 64bit IO Format:%I64d & %I64u Submit Status Practice POJ 3279 Description Farmer John knows that an intellectually satisfied cow is a happy cow who will give more milk. He has arranged a brainy acti

【CCF】无线网络 搜索+思维

1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<string> 5 #include<cmath> 6 #include<algorithm> 7 #include<queue> 8 #include<map> 9 #include<stack> 10 #include<vector> 11 1

程序员突围-程序调试分析(序)

-从实践到思考,痛苦的煎熬 其实算算,工作一年了,从大学毕业至今,接触编程已经五年了,但是真正的编程感觉还没有开始,从大一开始接触C语言,陆续接触c++,java,C#等等,现在感悟到了一点,编程语言学那么多有什么用呢?其实把一门编程语言学精了,学透了,其他的是触类旁通的(底层的C语言和C++可能有点例外),下面我会说一下我的经历,我感觉可能是大多数学习编程人的必经的阶段,让大家对编程的抵触少一些,然后想想一个我这样的白痴都能慢慢的开始程序调试,程序分析,你们绝对比我强的,下篇文章才会进入我的程

ACM总结报告

ACM总结报告       算法设计     姓名:杨加勇 学号:20143617 专业:计算机2班 指导老师:费玉奎        说是报告,其实更算是个总结,这学期这门选修课所学知识的一个大致总结.还是开始选择这门课时所说的,并无后悔或者惋惜一说,算法或许在以后一点也用不到,这个只是或许一直荒废,我不考研,也不去参加什么竞赛,工作也只是将关于计算机的作为一个过渡,我只想去创业,我只想管理自己创造出来的小小财富或是团队或是公司,但我相信,算法所设计的策略思维模式,与其他管理等决策的问题的解决方

中文分词技术(中文分词原理)

一.       为什么要进行中文分词? 词是最小的能够独立活动的有意义的语言成分,英文单词之间是以空格作为自然分界符的,而汉语是以字为基本的书写单位,词语之间没有明显的区分标记,因此,中文词语分析是中文信息处理的基础与关键. Lucene中对中文的处理是基于自动切分的单字切分,或者二元切分.除此之外,还有最大切分(包括向前.向后.以及前后相结合).最少切分.全切分等等. 二.       中文分词技术的分类 我们讨论的分词算法可分为三大类:基于字典.词库匹配的分词方法:基于词频度统计的分词方法

hdu5024Wang Xifeng&#39;s Little Plot(思维|搜索)

题目链接: huangjing 题意: 从图中任何一个点走,最多只能转90度的弯,并且只能转一次弯,求这个最长路.. 思路: ym的朝鲜选手的代码,真厉害啊,它是每个点的8个方向都走一遍,然后最后遍历全图,去每个点最多转一次弯的最大长度,这个确实有点厉害,相当于枚举拐点..还有就是方向最好的按顺序来,因为一个直角正好隔两个方向的位,好运算.. 题目 Wang Xifeng's Little Plot Time Limit: 2000/1000 MS (Java/Others)    Memory

思维导图教程之如何在MindManager15中文版中实现网络搜索的功能

MindManager15是Mindjet MindManager公司研发出的最高级别的版本,功能越来越强大,操作越来越简便.在软件内部进行网络搜索不仅可以让制作导图的过程更加简便,也可以节约大量的时间.本教程主讲如何进行MindManager15网络搜索,下面以制作MindManager服务中心思维导图为例进行演示. 如何进行MindManager15网络搜索? 步骤一 新建空白导图,输入MindManager服务中心. 步骤二 选中MindManager服务中心,在开始里面选择超链接,输入网

全文搜索知识点概要(思维导图)

引言 文章(全文搜索引擎 ElasticSearch 还是 Solr?) 这篇文章总结的很好, 将全文搜索的知识点总结的很有条理,为了更好的理解,我专门根据文章内容整理了一个思维导图,期望能对学习全文搜索 和 elasticsearch 的同学提供一个指导. 思维导图 系列文章列表 Elasticsearch 系列文章汇总(持续更新...) 原文地址:https://www.cnblogs.com/reycg-blog/p/10048815.html