[HIHO1196]高斯消元·二(高斯消元、枚举自由变元)
题目链接:http://hihocoder.com/problemset/problem/1196
#include <bits/stdc++.h>
using namespace std; typedef pair<int, int> pii;
const int maxn = ;
int equ, var;
int a[maxn][maxn];
int x[maxn];
int free_x[maxn];
int free_num;
int ret; int gauss() {
int max_r, col, k;
free_num = ;
for(k = , col = ; k < equ && col < var; k++, col++) {
max_r = k;
for(int i = k + ; i < equ; i++) {
if(abs(a[i][col]) > abs(a[max_r][col]))
max_r = i;
}
if(a[max_r][col] == ) {
k--;
free_x[free_num++] = col;
continue;
}
if(max_r != k) {
for(int j = col; j < var + ; j++)
swap(a[k][j], a[max_r][j]);
}
for(int i = k + ; i < equ; i++) {
if(a[i][col] != ) {
for(int j = col; j < var + ; j++) {
a[i][j] ^= a[k][j];
}
}
}
}
for(int i = k; i < equ; i++) {
if(a[i][col] != )
return -;
}
if(k < var) return var - k;
for(int i = var - ; i >= ; i--) {
x[i] = a[i][var];
for(int j = i + ; j < var; j++) {
x[i] ^= (a[i][j] & x[j]);
}
}
return ;
} char G[maxn][maxn];
int n, m; int main() {
// freopen("in", "r", stdin);
m = , n = ;
var = equ = ;
ret = ;
memset(a, , sizeof(a));
for(int i = ; i < n; i++) scanf("%s", G[i]);
for(int i = ; i < m; i++) {
for(int j = ; j < n; j++) {
if(G[i][j] == '') a[i*n+j][var] = ;
else a[i*n+j][var] = ;
}
}
for(int i = ; i < ; i++) {
a[i][i] = ;
if(i % != ) a[i-][i] = ;
if(i % != ) a[i+][i] = ;
if(i > ) a[i-][i] = ;
if(i < ) a[i+][i] = ;
}
int v = gauss();
if(v == -) ret = -;
else if(v != ) {
ret = maxn;
int tot = << v;
for(int i = ; i < tot; i++) {
int cnt = ;
for(int j = ; j < v; j++) {
if(i&(<<j)) {
x[free_x[j]] = ;
cnt++;
}
else x[free_x[j]] = ;
}
for(int j = var - v - ; j >= ; j--) {
int idx;
for(idx = j; idx < var; idx++) {
if(a[j][idx]) break;
}
x[idx] = a[j][var];
for(int l = idx + ; l < var; l++) {
if(a[j][l]) x[idx] ^= x[l];
}
cnt += x[idx];
}
ret = min(ret, cnt);
}
}
else for(int i = ; i < var; i++) ret += x[i];
printf("%d\n", ret);
vector<pii> va;
for(int i = ; i < ; i++) {
if(x[i]) {
int pos = i + ;
int r = , c = ;
while(pos > ) {
pos -= ;
r++;
}
c += pos;
va.push_back(pii(r, c));
}
}
sort(va.begin(), va.end());
for(int i = ; i < va.size(); i++) {
printf("%d %d\n", va[i].first, va[i].second);
}
return ;
}
[HIHO1196]高斯消元·二(高斯消元、枚举自由变元)的更多相关文章
- hiho #1196 : 高斯消元·二
#1196 : 高斯消元·二 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 在上一回中,小Hi和小Ho趁着便利店打折,买了一大堆零食.当他们结账后,看到便利店门口还有其 ...
- 高斯消元(Gauss消元)
众所周知,高斯消元可以用来求n元一次方程组的,主要思想就是把一个n*(n+1)的矩阵的对角线消成1,除了第n+1列(用来存放b的)的其他全部元素消成0,是不是听起来有点不可思议??! NO NO NO ...
- POJ 1681 Painter's Problem(高斯消元+枚举自由变元)
http://poj.org/problem?id=1681 题意:有一块只有黄白颜色的n*n的板子,每次刷一块格子时,上下左右都会改变颜色,求最少刷几次可以使得全部变成黄色. 思路: 这道题目也就是 ...
- POJ 1681 高斯消元 枚举自由变元
题目和poj1222差不多,但是解法有一定区别,1222只要求出任意一解,而本题需要求出最少翻转次数.所以需要枚举自由变元,变元数量为n,则枚举的次数为1<<n次 #include < ...
- 设计模式(十二)享元模式(Flyweight Pattern)
一.引言 在软件开发过程,如果我们需要重复使用某个对象的时候,如果我们重复地使用new创建这个对象的话,这样我们在内存就需要多次地去申请内存空间了,这样可能会出现内存使用越来越多的情况,这样的问题是非 ...
- 十二、享元(Flyweight)模式--结构模式(Structural Pattern)
Flyweight在拳击比赛中指最轻量级,即"蝇量级",有些作者翻译为"羽量级".这里使用"享元 模式"更能反映模式的用意. 享元模式以共享 ...
- Metaspace 之一:Metaspace整体介绍(永久代被替换原因、元空间特点、元空间内存查看分析方法)
回顾 根据JVM内存区域的划分,简单的画了下方的这个示意图.区域主要分为两大块,一块是堆区(Heap),我们所New出的对象都会在堆区进行分配,在C语言中的malloc所分配的方法就是从Heap区获取 ...
- [转]深刻理解Python中的元类(metaclass)以及元类实现单例模式
使用元类 深刻理解Python中的元类(metaclass)以及元类实现单例模式 在看一些框架源代码的过程中碰到很多元类的实例,看起来很吃力很晦涩:在看python cookbook中关于元类创建单例 ...
- 深刻理解Python中的元类(metaclass)以及元类实现单例模式
在理解元类之前,你需要先掌握Python中的类.Python中类的概念借鉴于Smalltalk,这显得有些奇特.在大多数编程语言中,类就是一组用来描述如何生成一个对象的代码段.在Python中这一点仍 ...
- Python元类(metaclass)以及元类实现单例模式
这里将一篇写的非常好的文章基本照搬过来吧,这是一篇在Stack overflow上很热的帖子,我看http://blog.jobbole.com/21351/这篇博客对其进行了翻译. 一.理解类也是对 ...
随机推荐
- Unity3D 开发 之 JDK安装与环境变量配置
安装JDK 选择安装目录 安装过程中会出现两次 安装提示 .第一次是安装 jdk ,第二次是安装 jre .建议两个都安装在同一个java文件夹中的不同文件夹中.(不能都安装在java文件夹的根目录 ...
- larave5.1l队列
官方文档http://laravel.com/docs/5.1/queues#dealing-with-failed-jobs 1.队列容器设置为数据库 config/queue.php 'defau ...
- UIBezierPath类 笔记
使用UIBezierPath类可以创建基于矢量的路径.此类是Core Graphics框架关于path的一个封装.使用此类可以定义简单的形状,如椭圆或者矩形,或者有多个直线和曲线段组成的形状. ...
- TI BLE协议栈软件框架分析
看源代码的时候,一般都是从整个代码的入口处开始,TI BLE 协议栈源码也不例外.它的入口main()函数就是整个程序的入口,由系统上电时自动调用. 它主要做了以下几件事情: (一)底层硬件初始化配 ...
- 【五子棋AI循序渐进】——整合完成
经过一年多的学习和探索,终于在今天得到了一些回报,在实现PVS多线程和加入了一个新的启发模式之后,搜索速度达到了120K左右,现在整合了VCF/VCT引擎.PVS混合引擎之后,棋力与连珠fiver6基 ...
- CCEA OCX
<HTML> <HEAD> <TITLE>CCEAActiveX演示页面</TITLE> <meta http-equiv="Conte ...
- Windows Server 2008R2服务器安装及设置教程
第一篇:系统安装与设置 前言本安装及设置教程适用于使用Windows2008R2为操作系统的服务器,目的是让服务器实现下列环境.语言脚本环境:ASP.ASP.Net1.1.ASP.Net2.0.ASP ...
- LeetCode Two Sum II - Input array is sorted
原题链接在这里:https://leetcode.com/problems/two-sum-ii-input-array-is-sorted/ 题目: Given an array of intege ...
- SynchronousQueue应用
SynchronousQueue是无界的,是一种无缓冲的等待队列,但是由于该Queue本身的特性,在某次添加元素后必须等待其他线程取走后才能继续添加:可以认为SynchronousQueue是一个缓存 ...
- Oracle 小案例
create database cstd; use cstd; /*1:建立学生表*/ create table student ( 学号 ) primary key, 姓名 ), 性别 ), 年龄 ...