题目链接:

翻转棋

题目分析:

先状压/\(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. Spark DataFrame中的join使用说明

    spark sql 中join的类型 Spark DataFrame中join与SQL很像,都有inner join, left join, right join, full join; 类型 说明 ...

  2. VO和DO的区别

    阿里巴巴Java开发手册中的DO.DTO.BO.AO.VO.POJO定义 分层领域模型规约: DO( Data Object):与数据库表结构一一对应,通过DAO层向上传输数据源对象. DTO( Da ...

  3. jpa现有接口方法说明 (转https://www.cnblogs.com/rulian/p/6557471.html)

    一.接口方法整理速查 下表针对于简单查询,即JpaRepository接口(继承了CrudRepository接口.PagingAndSortingRepository接口)中的可访问方法进行整理.( ...

  4. 19-MySQL-Ubuntu-数据表的查询-自关联(八)

    自关联   转自:https://blog.csdn.net/hubingzhong/article/details/81277220

  5. 【CF516D】Drazil and Morning Exercise

    题目 首先我们知道,在树上距离一个点最远的点一定是直径的两个端点之一 首先两遍\(\rm dfs\)把直径求出来,定义\(d(u)\)表示点\(u\)距离其最远点的距离,有了直径我们就能求出\(d\) ...

  6. spark 变量使用 broadcast、accumulator

    broadcast 官方文档描述: Broadcast a read-only variable to the cluster, returning a [[org.apache.spark.broa ...

  7. 常用指令linux总结

    linux的基础操作命令: 常见命令: man 查看帮助文档 用法:man + 命令 help 查看指定命令的用法 用法: 命令 --help(有空格) tab linux下命令与文件名补全 用法:在 ...

  8. 新知道一个 端对端加密 Signal protocol

    看 socketio Sponsors 列表中的小蓝鸟,发现网站中有使用 x-jquery-tmpl [翻译]WhatsApp 加密概述(技术白皮书) 知道一个叫 Signal 协议 的端对端加密 端 ...

  9. leetcode-241-为运算表达式设置优先级*

    题目描述: 方法:分治* class Solution: def diffWaysToCompute(self, input: str) -> List[int]: if input.isdig ...

  10. leetcode-第10周双周赛-5079-三个有序数组的交集

    题目描述: 自己的提交: class Solution: def arraysIntersection(self, arr1: List[int], arr2: List[int], arr3: Li ...