poj1681 高斯消元

题目大意: 一个n*n 的方格 ,我们对它进行染色,每个格子都 可以 染成 白色和黄色,( 一旦我们对这个格子染色 ,他的上下左右 都将改变颜色);给定一个初始状态 , 求将 所有的 格子 染成黄色 最少需要染几次? 若 不能 染成 输出 “inf” 解题思路: 我们可以首先来构造一个矩阵,这个矩阵式干啥的呢,我们可以认为这个矩阵是按下一个格子之后它能够作用的范围,将能够作用的范围用1表示否
摘要由CSDN通过智能技术生成

题目大意:
一个n*n 的方格 ,我们对它进行染色,每个格子都 可以 染成 白色和黄色,( 一旦我们对这个格子染色 ,他的上下左右 都将改变颜色);给定一个初始状态 , 求将 所有的 格子 染成黄色 最少需要染几次? 若 不能 染成 输出 “inf”
解题思路:
我们可以首先来构造一个矩阵,这个矩阵式干啥的呢,我们可以认为这个矩阵是按下一个格子之后它能够作用的范围,将能够作用的范围用1表示否则用0表示。来举个例子
就 根据一个3*3的矩阵,对于第一行第一列的元素来说,它可以影响的范围是它自己 还有它的右面的值和它的下面的值,矩阵中其余的值都是0,也就是说
A(0,0)=
1 1 0
1 0 0
0 0 0
A(0,1)=
1 1 1
1 0 0
0 0 0
现在我们设一个L矩阵,表示初始的状态,如果是y就是0,否则就是1,也就是说我们需要将当前的矩阵操为全是0的矩阵
L + x(1,1)*A(1,1) + x(1,2)*A(1,2) + x(1,3)*A(1,3) + x(2,1)*A(2,1) + … + x(3,3)*A(3,3) = 0 (1)
上述 方程的 x 表示的是一个未知数,因为我们不知道是否是按下这个按钮。那么x(i, j)=0表示不按,否则表示按。那么我们现在就是求一个这样的方程解最小的x,那么上述方程中的矩阵A可以用一个比较大 的矩阵n*n的来表示,然后就是转换一下关系就行了(具体在代码中有体现)。那么现在就是n个未知数,n个方程,在(1)中,可以两边加上L,那么就是变成了:
x(1,1)*A(1,1) + x(1,2)*A(1,2) + x(1,3)*A(1,3) + x(2,1)*A(2,1) + … + x(3,3)*A(3,3) = L(2)
X * A = L(类似这样的)
然后我们在枚举一下所有的状态:我们首先要枚举的是自由变元的个数,我们对它的所有状态都进行枚举,然后得到了如果符合状态的话就进行自由变元的赋值,然后我们在对可以确定的变元进行操作,那么肯定就是高斯中的回代过程,然后在进行判断,我们需要的就是最少的1,也就是最少能够操作的数。
具体还得详见代码:

n*n*n*n的矩阵
将网格编号,从左到右从上到下1到n,第i行表示每个开关对第i个开关影响多少,本题中每个开关最多操作一次,用的是异或版高斯消元

//<span style="font-size:18px;">
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <cmath>
using namespace std;
const int MAXN = 3e2+5;
const int INF = 1e9+5;
int e
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值