题目链接:

翻转棋

题目分析:

先状压/\(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. Day 14: 内置函数:

    Python提供了,许多内置的函数我们按 函数的作用来分类: 一.作用域相关的内置函数(2个) (1).globals() 更改全局变量 (2).locals()更改局并命名空间的变量(上一级) 五. ...

  2. 引入css文件时,css link和@import区别

    这里link与@import介绍的是html引入css的语法单词.两者均是引入css到html的单词. 一.了解基本 1.link语法结构 <link href="CSSurl路径&q ...

  3. eclipse导入别人项目配置tomcat和jdk

    1.file--import--General--Existing Projiect into Workspace-- 2.导入项目成功后,项目会有错误,需重新进行tomcat及jdk的配置 项目名右 ...

  4. 【Latex】一些使用

    http://www.mohu.org/info/symbols/symbols.htm GG..研究个公式就搞这么晚了..还不知道那三个报错的是怎么回事.. 意识模糊..睡了睡了. # Latex ...

  5. android:两个应用之间怎样传值之activity

    版权声明:本文为博主原创文章.未经博主同意不得转载. https://blog.csdn.net/zjh171/article/details/37738579 两个应用之间怎样传值.事实上这个标题太 ...

  6. JAVA API about HTTP 3

    package com.han.http; import java.io.IOException; import java.io.UnsupportedEncodingException; impor ...

  7. Ansible配置及使用

    使用公私钥实现ssh无密码登录 生成公钥和私钥 ssh-keygen -t rsa 公钥相当于锁id_rsa.pub,私钥相当于钥匙id_rsa 借用ssh-copy-id工具实现无密码登录 ssh- ...

  8. OpenCV-Python Tutorials目录

    版本 3.4.6 1 Introduction to OpenCV OpenCV介绍Learn how to setup OpenCV-Python on your computer! 2 Gui F ...

  9. 导入导出sql结构和数据

    导入导出sql结构和数据

  10. 「题解」:$Game$

    问题 B: $Game$ 时间限制: 1 Sec  内存限制: 256 MB 题面 题面谢绝公开. 题解 对于最初加入的每一个元素开桶记录出现次数. 然后记录一个前p个元素最大值. 先由先手玩家取走一 ...