题目链接:

翻转棋

题目分析:

先状压/\(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]翻转棋的更多相关文章

  1. bzoj1647 / P1985 [USACO07OPEN]翻转棋

    P1985 [USACO07OPEN]翻转棋 其实我们只要枚举第一行的状态,后面的所有状态都是可以唯一确定的. 用二进制枚举灰常方便 #include<iostream> #include ...

  2. 题解 P1985 【[USACO07OPEN]翻转棋】

    讲讲我的做法 刚开始做这道题的时候,看到\(n<=15\),我这个\(6\)年级的蒟蒻的第1反应是状压\(dp\).貌似不好做.然而,等到我在省中集训的时候,老师的一席话,让我豁然开朗.今天我准 ...

  3. 洛谷 P1985 翻转棋

    P1985 翻转棋 题目描述 农夫约翰知道,聪明的奶牛可以产更多的牛奶.他为奶牛设计了一种智力游戏,名叫翻转棋. 翻转棋可以分成 M × N 个格子,每个格子有两种颜色,一面是黑的,一面是白的. 一旦 ...

  4. python 翻转棋(othello)

    利用上一篇的框架,再写了个翻转棋的程序,为了调试minimax算法,花了两天的时间. 几点改进说明: 拆分成四个文件:board.py,player.py,ai.py,othello.py.使得整个结 ...

  5. 隔壁信概大作业xjb写——同化棋ATAXX

    话说泥萌北大信科啊,助教是有多懒...去年黑白棋今年同化棋,顺带打ai都不用自己写标程... 好吧..我知道泥萌重点在各种sb的辅助操作上..什么悲剧的可以随时暂停载入...有毒吧 [据说泥萌上课没讲 ...

  6. BestCoder Round #90

    有生以来第一场在COGS以外的地方打的比赛.挂成dog了. 主要是没有经验,加之代码能力过弱.还有最后的瞎hack三次,Too Young Too Simple...... 言归正传. (抄一发题解先 ...

  7. POJ1753Flip Game(DFS + 枚举)

    Flip Game Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 37050   Accepted: 16122 Descr ...

  8. poj 1753

    翻转棋,注意是翻转周围四个的,不是整行列的  汗-_-! 哥的代码风还是不错的 二进制储存状态 Sample Input bwwb bbwb bwwb bwww Sample Output 4 #in ...

  9. POJ 1753 Flip Game 状态压缩,暴力 难度:1

    Flip Game Time Limit: 1000MS  Memory Limit: 65536K  Total Submissions: 4863  Accepted: 1983 Descript ...

随机推荐

  1. Ctrl快捷键

    Ctrl + a - Jump to the start of the lineCtrl + b - Move back a charCtrl + c - Terminate the command ...

  2. sklearn中pipeline的用法和FeatureUnion

    一.pipeline的用法 pipeline可以用于把多个estimators级联成一个estimator,这么 做的原因是考虑了数据处理过程中一系列前后相继的固定流程,比如feature selec ...

  3. RocketMQ核心技术精讲与高并发抗压实战

    1:特点 比较吃内存 内存至少1g 默认8g 1:支持集群模型,强调集群无单点,负载均衡以及水平扩展能力2:亿级别的消息堆积能力3:采用零拷贝原理Consumer 消费消息过程,使用了零拷贝 顺序写盘 ...

  4. dubbo视频分享

    一.基础篇 第001节--课程介绍 第01节--使用Dubbo对传统工程进行服务化改造的思路介绍 第02节--使用Dubbo对传统工程进行服务化改造 第03节--ZooKeeper注册中心安装 第04 ...

  5. EntityFrameworkCore 根据实体类自动创建数据库

    1.首先新建 Asp.Net Core WebApi 项目 2.添加一下引用 : 2.1   Pomelo.EntityFrameworkCore.MySql(我用的Mysql 根据自己情况引用就行) ...

  6. Ubuntu下怎么退出vim编辑器

    vim其实就是vi的升级版,vi里的所有命令vim里都可以用,一般使用来说几乎没什么差别. 写在前面:进入vim编辑器之后无法退出并保存,可以尝试给要编辑的文件sudo权限(例如:sudo vim / ...

  7. 如何优雅的在 vue 中添加权限控制

    前言 在一个项目中,一些功能会涉及到重要的数据管理,为了确保数据的安全,我们会在项目中加入权限来限制每个用户的操作.作为前端,我们要做的是配合后端给到的权限数据,做页面上的各种各样的限制. 需求 因为 ...

  8. 2019.12.04 Java中的内存分配

    Java内存分配与管理是Java的核心技术之一,之前我们曾介绍过Java的内存管理与内存泄露以及Java垃圾回收方面的知识,今天我们再次深入Java核心,详细介绍一下Java在内存分配方面的知识.一般 ...

  9. linux上给其他在线用户发送信息(wall, write, talk, mesg)

        linux上给其他在线用户发送信息(wall, write, talk, mesg)   2018-01-05 lonskyMR 转自 恶之一眉 修改 微信分享: 设置登录提示     /et ...

  10. Maven - 深入理解maven构建生命周期和各种plugin插件

    作者:亚当-adam 来源:CSDN 原文:https://blog.csdn.net/zhaojianting/article/details/80321488 版权声明:本文为博主原创文章,转载请 ...