洛谷 P1985 翻转棋
题目描述
农夫约翰知道,聪明的奶牛可以产更多的牛奶。他为奶牛设计了一种智力游戏,名叫翻转棋。
翻转棋可以分成 M × N 个格子,每个格子有两种颜色,一面是黑的,一面是白的。
一旦翻转某个格子,这个格子的颜色就会颠倒。如果把所有的格子都翻成白的,就算奶牛赢
了。然而,奶牛的蹄子很大,一旦它们打算翻转某个格子,这个格子附近(即和这个格子有
公共边)的格子也会被翻转。一直翻来翻去也很无聊,奶牛们想最小化必须翻动的次数。
请帮助奶牛确定翻动的最少次数和具体的翻法。如果最小解有多个,则输出在字典序意义下
最小的那个,如果不可能完成任务,则只要输出一行单词:IMPOSSIBLE。
输入输出格式
输入格式:
第 1 行:两个整数:M 和 N
第 2 ~ M+1 行:第 i+1 行从左到右依次描述了棋盘第 i 行的颜色,共 N 个整数。 1 代
表黑色, 0 代表白色。
输出格式:
第 1 ~ M 行:每行 N 个整数,分别表示在各个格子上翻转的次数。
输入输出样例
说明
·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 翻转棋的更多相关文章
- 洛谷P1541 乌龟棋(四维DP)
To 洛谷.1541 乌龟棋 题目背景 小明过生日的时候,爸爸送给他一副乌龟棋当作礼物. 题目描述 乌龟棋的棋盘是一行N个格子,每个格子上一个分数(非负整数).棋盘第1格是唯一的起点,第N格是终点,游 ...
- 洛谷 p1541乌龟棋
洛谷 p1541乌龟棋 题目背景 小明过生日的时候,爸爸送给他一副乌龟棋当作礼物. 题目描述 乌龟棋的棋盘是一行NN个格子,每个格子上一个分数(非负整数).棋盘第1格是唯一的起点,第NN格是终点,游戏 ...
- [洛谷P1541] 乌龟棋
洛谷题目链接:乌龟棋 题目背景 小明过生日的时候,爸爸送给他一副乌龟棋当作礼物. 题目描述 乌龟棋的棋盘是一行N个格子,每个格子上一个分数(非负整数).棋盘第1格是唯一的起点,第N格是终点,游戏要求玩 ...
- [NOIP2010] 提高组 洛谷P1541 乌龟棋
题目背景 小明过生日的时候,爸爸送给他一副乌龟棋当作礼物. 题目描述 乌龟棋的棋盘是一行N个格子,每个格子上一个分数(非负整数).棋盘第1格是唯一的起点,第N格是终点,游戏要求玩家控制一个乌龟棋子从起 ...
- 洛谷 P1541 乌龟棋 Label:O(n^4)的dp
题目背景 小明过生日的时候,爸爸送给他一副乌龟棋当作礼物. 题目描述 乌龟棋的棋盘是一行N个格子,每个格子上一个分数(非负整数).棋盘第1格是唯一的起点,第N格是终点,游戏要求玩家控制一个乌龟棋子从起 ...
- 洛谷 P1541 乌龟棋
题目背景 小明过生日的时候,爸爸送给他一副乌龟棋当作礼物. 题目描述 乌龟棋的棋盘是一行N个格子,每个格子上一个分数(非负整数).棋盘第1格是唯一的起点,第N格是终点,游戏要求玩家控制一个乌龟棋子从起 ...
- codevs1068 乌龟棋==洛谷P1541 乌龟棋
P1541 乌龟棋 题目背景 小明过生日的时候,爸爸送给他一副乌龟棋当作礼物. 题目描述 乌龟棋的棋盘是一行N个格子,每个格子上一个分数(非负整数).棋盘第1格是唯一的起点,第N格是终点,游戏要求玩家 ...
- 洛谷P1541 乌龟棋 [2010NOIP提高组]
P1541 乌龟棋 题目背景 小明过生日的时候,爸爸送给他一副乌龟棋当作礼物. 题目描述 乌龟棋的棋盘是一行N个格子,每个格子上一个分数(非负整数).棋盘第1格是唯一的起点,第N格是终点,游戏要求玩家 ...
- dp——洛谷 P1541 乌龟棋 —— by hyl天梦
题目:(转自 https://www.luogu.com.cn/problem/P1541) 题目描述 乌龟棋的棋盘是一行NN个格子,每个格子上一个分数(非负整数).棋盘第1格是唯一的起点,第NN格是 ...
随机推荐
- 安卓开发,adb shell 调试sqlite3数据库
安卓开发,adb shell 调试sqlite3数据库 在安卓中创建了sqlite3数据库,想要调试怎么办? 通过adb shell来进行查看. 第一步,将adb加入到系统变量中. 这样就可以在命令行 ...
- 图解时间复杂度O(n)
画一个16个格子.大O表示计算的操作数. 算法1 需要16步. 算法2 算法1的时间复杂度为O(n) 算法2的时间复杂度为O(logn) n为元素个数16 O中的内容为操作的次数 5种常用的时间复杂度
- zzulioj--1775-- 和尚特烦恼1——是不是素数(素数水题)
1775: 和尚特烦恼1--是不是素数 Time Limit: 2 Sec Memory Limit: 128 MB Submit: 563 Solved: 193 SubmitStatusWeb ...
- Word frequency analysis
Write a program that reads a file, breaks each line into words, scripts whitespace and punctuation f ...
- POJ 3145 线段树 分块?+暴力
思路: 线段树 (分类讨论) 此题数据很水 数据很水 数据很水 但是卡个暴力还是没问题的-- //By SiriusRen #include <cstdio> #include <c ...
- Metasploit学习笔记(博主推荐)
不多说,直接上干货! 连接后台的数据库,当然不是必须品. 连接数据库的好处:1.可以攻击和扫描的结果,保存起来 2.将一些搜索结果做个缓存 默认数据库是postgresql. 同时要注意的是 ...
- Django分页和查询参数的问题
查询是通过get的方式,之前没有分页之前,url是这样的: http://hostname/search?query=port%3A8080 那么我的想法是如果分页了. 1,不带page参数了.nex ...
- UI Framework-1: Native Controls
Native Controls Background Despite the fact that views provides facilities for custom layout, render ...
- SSH概述与配置文件说明
一.什么是SSH? 简单说,SSH是一种网络协议,用于计算机之间的加密登录.在出现SSH之前,系统管理员需要登入远程服务器执行系统管理任务时,都是用telnet来实现的,telnet协议采用明文密码传 ...
- 使用maven安装jar到本地仓库
mvn install:install-file "-DgroupId={安装的jar包的groupid,可以随意起名}" "-DartifactId={安装jar包的I ...