题目描述

农夫约翰知道,聪明的奶牛可以产更多的牛奶。他为奶牛设计了一种智力游戏,名叫翻转棋。

翻转棋可以分成 M × N 个格子,每个格子有两种颜色,一面是黑的,一面是白的。

一旦翻转某个格子,这个格子的颜色就会颠倒。如果把所有的格子都翻成白的,就算奶牛赢

了。然而,奶牛的蹄子很大,一旦它们打算翻转某个格子,这个格子附近(即和这个格子有

公共边)的格子也会被翻转。一直翻来翻去也很无聊,奶牛们想最小化必须翻动的次数。

请帮助奶牛确定翻动的最少次数和具体的翻法。如果最小解有多个,则输出在字典序意义下

最小的那个,如果不可能完成任务,则只要输出一行单词:IMPOSSIBLE。

输入输出格式

输入格式:

第 1 行:两个整数:M 和 N

第 2 ~ M+1 行:第 i+1 行从左到右依次描述了棋盘第 i 行的颜色,共 N 个整数。 1 代

表黑色, 0 代表白色。

输出格式:

第 1 ~ M 行:每行 N 个整数,分别表示在各个格子上翻转的次数。

输入输出样例

输入样例#1: 复制

4 4 
1 0 0 1 
0 1 1 0 
0 1 1 0 
1 0 0 1
输出样例#1: 复制

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

说明

·1 ≤ M, N ≤ 15

思路:搜索

由于第一行的修改方案确定之后,每一行的修改方案就确定了,所以说我们只需要用dfs枚举第一行的修改方案。

而接下来的行数修改的最佳方案是将为1的数的正下方的数进行修改,这样的好处是每行处理完只需要考虑下一行,不需要考虑以上的行数。

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
int n,m;
int f[][],ans[][],cz[][],a[][];
int minn=;
void dfs(int lie){
if(lie>m){
for(int i=;i<=n;i++)
for(int j=;j<=m;j++)
cz[i][j]=a[i][j];
for(int i=;i<=m;i++)
if(f[][i]){
cz[][i]^=;cz[][i]^=;
cz[][i+]^=;cz[][i-]^=;
}
for(int i=;i<=n;i++)
for(int j=;j<=m;j++){
if(cz[i-][j]==){
f[i][j]=;cz[i][j]^=;
cz[i][j+]^=;cz[i][j-]^=;
cz[i+][j]^=;cz[i-][j]^=;
}
else f[i][j]=;
}
bool pd=false;
for(int i=;i<=n;i++)
for(int j=;j<=m;j++)
if(cz[i][j]){
pd=true;
break;
}
if(!pd){
int sum=;
for(int i=;i<=n;i++)
for(int j=;j<=m;j++)
if(f[i][j]) sum++;
if(sum>=minn) return;
minn=sum;
for(int i=;i<=n;i++)
for(int j=;j<=m;j++)
ans[i][j]=f[i][j];
}
return;
}
for(int i=;i<=;i++){
f[][lie]=i;
dfs(lie+);
}
}
int main(){
scanf("%d%d",&n,&m);
for(int i=;i<=n;i++)
for(int j=;j<=m;j++)
cin>>a[i][j];
dfs();
if(minn==){
cout<<"IMPOSSIBLE";
return ;
}
for(int i=;i<=n;i++){
for(int j=;j<=m;j++)
cout<<ans[i][j]<<" ";
cout<<endl;
}
}
/*
4 4
1 0 0 1
0 1 1 0
0 1 1 0
1 0 0 1
*/

洛谷 P1985 翻转棋的更多相关文章

  1. 洛谷P1541 乌龟棋(四维DP)

    To 洛谷.1541 乌龟棋 题目背景 小明过生日的时候,爸爸送给他一副乌龟棋当作礼物. 题目描述 乌龟棋的棋盘是一行N个格子,每个格子上一个分数(非负整数).棋盘第1格是唯一的起点,第N格是终点,游 ...

  2. 洛谷 p1541乌龟棋

    洛谷 p1541乌龟棋 题目背景 小明过生日的时候,爸爸送给他一副乌龟棋当作礼物. 题目描述 乌龟棋的棋盘是一行NN个格子,每个格子上一个分数(非负整数).棋盘第1格是唯一的起点,第NN格是终点,游戏 ...

  3. [洛谷P1541] 乌龟棋

    洛谷题目链接:乌龟棋 题目背景 小明过生日的时候,爸爸送给他一副乌龟棋当作礼物. 题目描述 乌龟棋的棋盘是一行N个格子,每个格子上一个分数(非负整数).棋盘第1格是唯一的起点,第N格是终点,游戏要求玩 ...

  4. [NOIP2010] 提高组 洛谷P1541 乌龟棋

    题目背景 小明过生日的时候,爸爸送给他一副乌龟棋当作礼物. 题目描述 乌龟棋的棋盘是一行N个格子,每个格子上一个分数(非负整数).棋盘第1格是唯一的起点,第N格是终点,游戏要求玩家控制一个乌龟棋子从起 ...

  5. 洛谷 P1541 乌龟棋 Label:O(n^4)的dp

    题目背景 小明过生日的时候,爸爸送给他一副乌龟棋当作礼物. 题目描述 乌龟棋的棋盘是一行N个格子,每个格子上一个分数(非负整数).棋盘第1格是唯一的起点,第N格是终点,游戏要求玩家控制一个乌龟棋子从起 ...

  6. 洛谷 P1541 乌龟棋

    题目背景 小明过生日的时候,爸爸送给他一副乌龟棋当作礼物. 题目描述 乌龟棋的棋盘是一行N个格子,每个格子上一个分数(非负整数).棋盘第1格是唯一的起点,第N格是终点,游戏要求玩家控制一个乌龟棋子从起 ...

  7. codevs1068 乌龟棋==洛谷P1541 乌龟棋

    P1541 乌龟棋 题目背景 小明过生日的时候,爸爸送给他一副乌龟棋当作礼物. 题目描述 乌龟棋的棋盘是一行N个格子,每个格子上一个分数(非负整数).棋盘第1格是唯一的起点,第N格是终点,游戏要求玩家 ...

  8. 洛谷P1541 乌龟棋 [2010NOIP提高组]

    P1541 乌龟棋 题目背景 小明过生日的时候,爸爸送给他一副乌龟棋当作礼物. 题目描述 乌龟棋的棋盘是一行N个格子,每个格子上一个分数(非负整数).棋盘第1格是唯一的起点,第N格是终点,游戏要求玩家 ...

  9. dp——洛谷 P1541 乌龟棋 —— by hyl天梦

    题目:(转自 https://www.luogu.com.cn/problem/P1541) 题目描述 乌龟棋的棋盘是一行NN个格子,每个格子上一个分数(非负整数).棋盘第1格是唯一的起点,第NN格是 ...

随机推荐

  1. YTUOJ-计算该日在本年中是第几天(用户自己定义类型)

    题目描写叙述 定义一个结构体变量(包含年.月.日).编写一个函数days,由主函数将年.月.日传递给函数days,计算出该日在本年中是第几天并将结果传回主函数输出. 输入 年月日 输出 当年第几天 例 ...

  2. m_Orchestrate learning system---二十五、复制类的时候最容易出现的错误是什么

    m_Orchestrate learning system---二十五.复制类的时候最容易出现的错误是什么 一.总结 一句话总结:命名空间错误导致Analyze类虽然继承了Base类,但是没有执行里面 ...

  3. Traversing a list

    The most common way to traverse the elements of a list is with a for loop. The syntax is the same as ...

  4. HBase框架基础(一)

    * HBase框架基础(一) 官方网址:http://hbase.apache.org/ * HBase是什么妖怪? 要解释HBase,我们就先说一说经常接触到的RDBMS,即关系型数据库: ** m ...

  5. Linux 玩法

    php 跑不了,只来404 同一台linux服务器上建两个网站(www.A.com, www.B.com),现在A和B都跑起来了,但只有 A 能跑 php, B只能跑静态 html 文件,不知道哪里设 ...

  6. P1452 Beauty Contes(旋转卡壳版)

    题目背景 此处省略1W字^ ^ 题目描述 贝茜在牛的选美比赛中赢得了冠军”牛世界小姐”.因此,贝西会参观N(2 < = N < = 50000)个农场来传播善意.世界将被表示成一个二维平面 ...

  7. html局部页面打印

    1.局部打印函数. function preview(oper) { if (oper < 10) { bdhtml=window.document.body.innerHTML;//获取当前页 ...

  8. NodeJS学习笔记 (23)模块机制-module

    https://github.com/chyingp/nodejs-learning-guide

  9. CF85E Guard Towers(二分答案+二分图)

    题意 已知 N 座塔的坐标,N≤5000 把它们分成两组,使得同组内的两座塔的曼哈顿距离最大值最小 在此前提下求出有多少种分组方案 mod 109+7 题解 二分答案 mid 曼哈顿距离 >mi ...

  10. 第一章、zabbix安装

    前言: 注意:本文不涉及性能测试.性能优化中的监控,所有文字的出发点都是日常运维监控. 在开始之前,我们还是先统一下认识:要监控一个对象,需要掌握哪些东西呢? 监控对象的理解:要监控的对象你是否了解呢 ...