题目描述

Farmer John's cows like to play an interesting variant of the popular game of "Sudoku". Their version involves a 9 x 9 grid of 3 x 3 subgrids, just like regular Sudoku. The cows' version, however, uses only binary digits:

000 000 000

001 000 100

000 000 000

000 110 000

000 111 000

000 000 000

000 000 000

000 000 000

000 000 000

The goal of binary Sudoku is to toggle as few bits as possible so that each of the nine rows, each of the nine columns, and each of the nine 3 x 3 subgrids has even parity (i.e., contains an even number of 1s). For the example above, a set of 3 toggles gives a valid solution:

000 000 000

001 000 100

001 000 100

000 110 000

000 110 000

000 000 000

000 000 000

000 000 000

000 000 000

Given the initial state of a binary Sudoku board, please help the cows determine the minimum number of toggles required to solve it.

给出一个9*9的01矩阵,问最少修改几个数能使每行、每列以及每个九宫格中1的个数均为偶数。

输入输出格式

输入格式:

* Lines 1..9: Each line contains a 9-digit binary string corresponding to one row of the initial game board.

输出格式:

* Line 1: The minimum number of toggles required to make every row, column, and subgrid have even parity.

输入输出样例

输入样例#1:

000000000
001000100
000000000
000110000
000111000
000000000
000000000
000000000
000000000

输出样例#1:

3

说明

The Sudoku board in the sample input is the same as in the problem text above.

Three toggles suffice to solve the puzzle.

Solution:

  本题贼有意思。

  很容易想到整个棋盘最多只要$81$次翻转(即把每个棋子都翻转),但是显然实际上不用这么多次。

  那么我们直接$IDA*$,每个位置的棋子要么翻转要么不翻转,然后分别记录一下每行、每列、每个九宫格内的棋子个数,估价函数就是取三者中不满足偶数条件个数最多的个数(至少需要这么多次翻转才能使棋子变为偶数),然后剪枝就好了。

代码:

#include<bits/stdc++.h>
#define il inline
#define ll long long
#define For(i,a,b) for(int (i)=(a);(i)<=(b);(i)++)
#define Bor(i,a,b) for(int (i)=(b);(i)>=(a);(i)--)
using namespace std;
const int N=15;
int mp[N][N],dep,tmp[N][N],squ[N],line[N],lit[N];
bool vis[N][N];il void change(int x,int y){if(x<=3){if(y<=3)squ[1]^=1;else if(y<=6)squ[2]^=1;else squ[3]^=1;return;}else if(x<=6){if(y<=3)squ[4]^=1;else if(y<=6)squ[5]^=1;else squ[6]^=1;return;}else {if(y<=3)squ[7]^=1;else if(y<=6)squ[8]^=1;else squ[9]^=1;return;}
}il void dfs(int tot,int lsx,int lsy){if(tot>dep||lsx==10)return;int px=0,py=0,ps=0;For(i,1,9) {if(line[i]&1)px++;if(lit[i]&1)py++;if(squ[i]&1)ps++;}if((!px)&&(!py)&&(!ps))cout<<tot-1,exit(0);if(tot+max(px,max(py,ps))>dep)return;lsy++;if(lsy>9)lsy=1,lsx++;tmp[lsx][lsy]^=1,line[lsx]^=1,lit[lsy]^=1,change(lsx,lsy);dfs(tot+1,lsx,lsy);tmp[lsx][lsy]^=1,line[lsx]^=1,lit[lsy]^=1,change(lsx,lsy);dfs(tot,lsx,lsy);
}int main(){For(i,1,9) {For(j,1,9){scanf("%1d",&tmp[i][j]);if(tmp[i][j])line[i]^=1,lit[j]^=1,change(i,j);}}bool f=0;For(i,1,9) if((line[i]&1)||(lit[i]&1)||(squ[i]&1)){f=1;break;}if(!f)cout<<0;else while(1)dep++,dfs(1,1,0);return 0;
}

转载于:https://www.cnblogs.com/five20/p/9298883.html

P3032 [USACO11NOV]二进制数独Binary Sudoku相关推荐

  1. MySQL 二进制日志(Binary Log)

    同大多数关系型数据库一样,日志文件是MySQL数据库的重要组成部分. MySQL有几种不同的日志文件.通常包括错误日志文件,二进制日志,通用日志,慢查询日志,等等.这些日志能够帮助我们定位mysqld ...

  2. 用 Python 解数独(Sudoku)

    芬兰数学家因卡拉花费3个月时间设计出的世界上迄今难度最大的数独.数独是 9 横 9 竖共有 81 个格子,同时又分为 9 个九宫格.规则很简单:每个空格填入 1~9 任意一个数字,需要保证每个横排和竖 ...

  3. [逆向工程] 二进制拆弹Binary Bombs 快乐拆弹 详解

    二进制拆弹 binary bombs 教你最快速解题,成功拆弹 最近计算机基础课,的实验lab2,二进制拆弹,可以说是拆的我很快乐了(sub n, %hair) 此处头发减n 我刚开始做的时候很是懵逼 ...

  4. 数据库binlog(二进制日志binary log)

    二进制日志中存储的内容称之为事件,每一个数据库更新操作(Insert.Update.Delete,不包括Select)等都对应一个事件. mysql binlog基本原理 - 简书 (jianshu. ...

  5. 数独(SuDoku)介绍

    数独(SuDoku)介绍 http://blog.csdn.net/lihongzhai/ 日期:2005-10-11 04:49:24 数独(日语:数独 すうどく)是一种源自18世纪末的瑞士,后在美 ...

  6. 逻辑航线信息学系列教程:二进制(Binary)

    逻辑航线信息学系列教程 二进制(Binary)         二进制是计算技术中广泛采用的一种数制,是现代计算机的运算基础. 计算机仅仅能识别 "0" 和 "1&quo ...

  7. 数独窟(Sudoku) -- Silverlight

    数独窟(Sudoku) -- Silverlight 有 6x6.8x8.9x9.12x12 四种大小,并有 标准数独.对角数独(X数独).增区数独 与 锯齿数独(Jigsaw Sudoku; 拼图数 ...

  8. mysql bin.000013_mysql运维-二进制日志BINARY LOG清理_ mysql-bin磁盘占用高处理办法

    1.1 方法1:PURGE MASTER LOGS 语法: PURGE { BINARY | MASTER } LOGS { TO 'log_name' | BEFORE datetime_expr ...

  9. 求解数独难题, Sudoku问题(回溯)

    Introduction : 标准的数独游戏是在一个 9 X 9 的棋盘上填写 1 – 9 这 9 个数字,规则是这样的: 棋盘分成上图所示的 9 个区域(不同颜色做背景标出,每个区域是 3 X 3 ...

最新文章

  1. 多线程终极模式:生产者-消费者模式
  2. SpringBoot接口幂等性实现的4种方案!
  3. android bitmap drawable 互转
  4. 推荐:.Net 5开源免费的内容管理系统
  5. zxing二维码的生成与解码(C#)
  6. Report Style
  7. 容器的基础 XmlBeanFactory(下篇)
  8. 最通俗易懂的 Java 10 新特性讲解 | 原力计划
  9. hashmap containsvalue时间复杂度_恕我直言,你真的了解HashMap吗?
  10. 小说阅读网站设计HTML,HTML5+CSS3网站设计基础教程
  11. C语言 矩阵相似度
  12. VS中打开C项目源文件、头文件分类文件夹不见了?这样操作打开!
  13. oracle筛选后怎样重新排序,excel表格筛选后怎么重新排序
  14. 上海落户条件—海归落户上海
  15. Rayson API 框架分析系列之5: NIO实现原理
  16. python裁剪图片大小
  17. Win8.1开始菜单Classic Shell 4.0上手
  18. Windows Sockets概述
  19. 个体对于吸烟人群的态度
  20. 2021-2027全球与中国翠绿宝石激光器市场现状及未来发展趋势

热门文章

  1. java使用bks双向认证_android客户端SSL单向双向认证
  2. android方法是对象吗,为什么android中对象不初始化也能调用方法?
  3. bzoj 4237: 稻草人(CDQ分治+单调栈+二分)
  4. 随机增量法:bzoj 1336 bzoj 1337 最小圆覆盖
  5. torch.randn
  6. 吴恩达神经网络和深度学习-学习笔记-36-网络中的网络以及1×1卷积
  7. Python实现Kubernetes Operator
  8. ModuleNotFoundError: No module named ‘librosa‘
  9. 图像处理二:仿射变换和透视变换
  10. 数据集.npy格式与png格式互换