P1985 [USACO07OPEN]翻转棋
题目链接:
题目分析:
先状压/\(dfs\)枚举第一排状态,然后在每个\(1\)下面翻,即确定了第一排就确定了后面的状态
最后验证一下最后一排是不是全0即可
代码:
#include<bits/stdc++.h>
#define N 50
using namespace std;
inline int read() {
int cnt = 0, f = 1; char c = getchar();
while (!isdigit(c)) {if (c == '-') f = -f; c = getchar();}
while (isdigit(c)) {cnt = (cnt << 3) + (cnt << 1) + (c ^ 48); c = getchar();}
return cnt * f;
}
int mapp[N][N], m, n, cnt, ans[N][N], res = (1 << 30);
bool vis[N][N], flag;
void rev(int x, int y) {
mapp[x][y] ^= 1;
mapp[x][y - 1] ^= 1;
mapp[x - 1][y] ^= 1;
mapp[x][y + 1] ^= 1;
mapp[x + 1][y] ^= 1;
}
void cpy() {
for (register int i = 1; i <= m; ++i)
for (register int j = 1; j <= n; ++j) ans[i][j] = vis[i][j];
}
void work() {
for (register int i = 2; i <= m; ++i)
for (register int j = 1; j <= n; ++j) if (mapp[i - 1][j]) rev(i, j), vis[i][j] = 1, ++cnt;
flag = 0;
for (register int i = 1; i <= m; ++i)
for (register int j = 1; j <= n; ++j) if (mapp[i][j]) flag = 1;
if (!flag) if (cnt < res) cpy(), res = cnt;
for (register int i = 2; i <= m; ++i)
for (register int j = 1; j <= n; ++j) if (vis[i][j]) rev(i, j), vis[i][j] = 0, --cnt;
}
void dfs_(int k) {
if (!k) {work(); return;}
dfs_(k - 1), rev(1, k), vis[1][k] = 1, ++cnt;
dfs_(k - 1), rev(1, k), vis[1][k] = 0, --cnt;
}
int main() {
m = read(), n = read();
for (register int i = 1; i <= m; ++i)
for (register int j = 1; j <= n; ++j) mapp[i][j] = read();
dfs_(n);
if (res == (1 << 30)) return printf("IMPOSSIBLE"), 0;
for (register int i = 1; i <= m; ++i) {
for (register int j = 1; j <= n; ++j) printf("%d ", ans[i][j]);
printf("\n");
}
return 0;
}#include<bits/stdc++.h>
#define N 50
using namespace std;
inline int read() {
int cnt = 0, f = 1; char c = getchar();
while (!isdigit(c)) {if (c == '-') f = -f; c = getchar();}
while (isdigit(c)) {cnt = (cnt << 3) + (cnt << 1) + (c ^ 48); c = getchar();}
return cnt * f;
}
int mapp[N][N], m, n, cnt, ans[N][N], res = (1 << 30);
bool vis[N][N], flag;
void rev(int x, int y) {
mapp[x][y] ^= 1;
mapp[x][y - 1] ^= 1;
mapp[x - 1][y] ^= 1;
mapp[x][y + 1] ^= 1;
mapp[x + 1][y] ^= 1;
}
void cpy() {
for (register int i = 1; i <= m; ++i)
for (register int j = 1; j <= n; ++j) ans[i][j] = vis[i][j];
}
void work() {
for (register int i = 2; i <= m; ++i)
for (register int j = 1; j <= n; ++j) if (mapp[i - 1][j]) rev(i, j), vis[i][j] = 1, ++cnt;
flag = 0;
for (register int i = 1; i <= m; ++i)
for (register int j = 1; j <= n; ++j) if (mapp[i][j]) flag = 1;
if (!flag) if (cnt < res) cpy(), res = cnt;
for (register int i = 2; i <= m; ++i)
for (register int j = 1; j <= n; ++j) if (vis[i][j]) rev(i, j), vis[i][j] = 0, --cnt;
}
void dfs_(int k) {
if (!k) {work(); return;}
dfs_(k - 1), rev(1, k), vis[1][k] = 1, ++cnt;
dfs_(k - 1), rev(1, k), vis[1][k] = 0, --cnt;
}
int main() {
m = read(), n = read();
for (register int i = 1; i <= m; ++i)
for (register int j = 1; j <= n; ++j) mapp[i][j] = read();
dfs_(n);
if (res == (1 << 30)) return printf("IMPOSSIBLE"), 0;
for (register int i = 1; i <= m; ++i) {
for (register int j = 1; j <= n; ++j) printf("%d ", ans[i][j]);
printf("\n");
}
return 0;
}
P1985 [USACO07OPEN]翻转棋的更多相关文章
- bzoj1647 / P1985 [USACO07OPEN]翻转棋
P1985 [USACO07OPEN]翻转棋 其实我们只要枚举第一行的状态,后面的所有状态都是可以唯一确定的. 用二进制枚举灰常方便 #include<iostream> #include ...
- 题解 P1985 【[USACO07OPEN]翻转棋】
讲讲我的做法 刚开始做这道题的时候,看到\(n<=15\),我这个\(6\)年级的蒟蒻的第1反应是状压\(dp\).貌似不好做.然而,等到我在省中集训的时候,老师的一席话,让我豁然开朗.今天我准 ...
- 洛谷 P1985 翻转棋
P1985 翻转棋 题目描述 农夫约翰知道,聪明的奶牛可以产更多的牛奶.他为奶牛设计了一种智力游戏,名叫翻转棋. 翻转棋可以分成 M × N 个格子,每个格子有两种颜色,一面是黑的,一面是白的. 一旦 ...
- python 翻转棋(othello)
利用上一篇的框架,再写了个翻转棋的程序,为了调试minimax算法,花了两天的时间. 几点改进说明: 拆分成四个文件:board.py,player.py,ai.py,othello.py.使得整个结 ...
- 隔壁信概大作业xjb写——同化棋ATAXX
话说泥萌北大信科啊,助教是有多懒...去年黑白棋今年同化棋,顺带打ai都不用自己写标程... 好吧..我知道泥萌重点在各种sb的辅助操作上..什么悲剧的可以随时暂停载入...有毒吧 [据说泥萌上课没讲 ...
- BestCoder Round #90
有生以来第一场在COGS以外的地方打的比赛.挂成dog了. 主要是没有经验,加之代码能力过弱.还有最后的瞎hack三次,Too Young Too Simple...... 言归正传. (抄一发题解先 ...
- POJ1753Flip Game(DFS + 枚举)
Flip Game Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 37050 Accepted: 16122 Descr ...
- poj 1753
翻转棋,注意是翻转周围四个的,不是整行列的 汗-_-! 哥的代码风还是不错的 二进制储存状态 Sample Input bwwb bbwb bwwb bwww Sample Output 4 #in ...
- POJ 1753 Flip Game 状态压缩,暴力 难度:1
Flip Game Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 4863 Accepted: 1983 Descript ...
随机推荐
- jquery操作html元素之(添加元素)
添加新的 HTML 内容 我们将学习用于添加新内容的四个 jQuery 方法: append() - 在被选元素的结尾插入内容 prepend() - 在被选元素的开头插入内容 after() - 在 ...
- C++之运算符_算数运算符
运算符 **作用:**用于执行代码的运算 | **运算符类型** | **作用** || -------------- | -------------------------------------- ...
- css3的选择器
先来做一下准备工作 页面的效果: 看到上面的框框了吗?我们就是通过给这些框框添加背景色的方式,来让大家,了解css3的选择器的效果,下面正式开始: 关联选择器 E1~E2 选择 E1 后面的兄弟 E2 ...
- angularJS ng-model与wdatapicker问题记录
代码: <input type="text" placeholder="开始日期" ng-model="data_start" onF ...
- Linux tee命令使用详解分享
tee命令主要被用来向standout(标准输出流,通常是命令执行窗口)输出的同时也将内容输出到文件,下面是tee的man 信息 read from standard input and write ...
- 揭秘 Flink 1.9 新架构,Blink Planner 你会用了吗?
本文为 Apache Flink 新版本重大功能特性解读之 Flink SQL 系列文章的开篇,Flink SQL 系列文章由其核心贡献者们分享,涵盖基础知识.实践.调优.内部实现等各个方面,带你由浅 ...
- day32--面向对象的程序设计之继承实现的原理(继承顺序)、封装、property
Python之路,Day19 = 面向对象的程序设计之继承实现的原理(继承顺序).封装.property 以下类容参考自:http://www.cnblogs.com/metianzing/p/712 ...
- VS开发工具的常用插件
转 http://www.spersky.com/post/vsPlugins.html 我目前主要用的是Hide Main Page——公司配给的电脑屏幕分辨率好小,还是1366*768的,去掉头可 ...
- ImageMagick convert多张照片JPG转成pdf格式,pdfunite合并PDF文件
在认识ImageMagick之前,我***的图像浏览软件是KuickShow,截图软件是KSnapShot,这两款软件都是KDE附带的软件,用起来也是蛮方便的.在一次偶然的机会中,我遇到了Imag ...
- error C2872: 'ULONG_PTR' : ambiguous symbol
转自VC错误:http://www.vcerror.com/?p=74 问题描述: 错误:error C2872: 'ULONG_PTR' : ambiguous symbol 解决方法: 详细的解决 ...