難點在於構建方程組
題目大意:
有 n 盞燈,m 個開關,每個開關可以控制多盞燈,每盞燈可以被多盞開關控制。開
始每盞燈都是開閉狀態,給定每盞燈的最終狀態,問有多少種方案可以到達。
解題思路:
對於每一盞燈,可以列出乙個方程,這樣就可以列出 n 個方程,有 m 個未知量。從
而構成乙個 n*m 的矩陣,對應每盞燈的最終狀態。構建乙個增廣矩陣,用高斯消元
法求解自由變元個數 ans。因為開關只有開、關兩種狀態,所以答案為 2^ans。
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
using
namespace
std;
#define ll long long
#define ull unsigned long long
#define pii pair
#define inf 1000000007
const
double eps=1e-5;
const
int maxn=55;
int matrix[maxn][maxn];//儲存增廣矩陣
int copymatrix[maxn][maxn];//增廣矩陣的副本
int gauss(int a[maxn],const
int&m,const
int&n)
if(a[r][i]==0)
for(int j=0;j//消去其他方程的i變元
if((j!=r)&&(a[j][i]!=0))
for(int k=i;k<=m;++k)
a[j][k]^=a[r][k];
++r;//矩陣的秩+1
}//矩陣的秩下面的方程 係數都為0 0*x1+0*x2+...+0*xm恆等於0 !=0則無解
for(int i=r;iif(a[i][m])//判斷是否無解
return -1;
return res;
}int main()
}printf("case %d:\n",ca);
int q;
scanf("%d",&q);
while(q--)
}return
0;}
hdu3364 Lanterns 高斯消元
有m個開關,n個燈泡,每個開關可以控制不同的燈泡 可以有多個 給定n個燈泡的亮暗情況,問有多少種開關的情況 用a i j 表示第j個開關對第i個燈泡能否控制,1為能,0為否 用高斯消元,ans 2 var k var k 為自由變數數 include include include using na...
hdu 3915 高斯消元
這道題目是和博弈論掛鉤的高斯消元。本題涉及的博弈是nim博弈,結論是 當先手處於奇異局勢時 幾堆石子數相互異或為0 其必敗。思路在這裡,最後由於自由變元能取1 0兩種狀態,所以,最終答案是2 k,k表示自由變元的個數。include include include include include i...
HDU 5755 高斯消元
題意 給出乙個模3意義下的矩陣,每次選中乙個元素就可以使得自身 2,上下左右元素 1。求所有元素變成0的一種解。o nm 3 怎麼會不炸!怎麼會不炸!好吧就是不炸,可能在消元的時候0比較多吧 可以為什麼不用列舉自由元呢?不是很懂這個資料 直接按照上下左右自身的元素對自己的貢獻建立方程組暴力消元,遇到...