poj 1222 (高斯消元)

2021-06-12 14:30:10 字數 2166 閱讀 8120

(1)高斯消元法求解 ( 適用於01方矩陣的問題,不適用在解線性方程組中)

首先介紹一下怎樣用高斯消元法解題!!

這個遊戲的名字叫做lights out。乙個板子上面有mxn個按鈕,按鈕也是燈。每次按下乙個按鈕,這個按鈕和它的上下左右相鄰按鈕將同時切換各自的亮滅狀態。給你乙個初始狀態,請給出一種方法,按某些按鈕,使得所有的燈都滅。

這個遊戲有一些技巧:

1、按按鈕的順序可以隨便。

2、任何乙個按鈕都最多需要按下1次。因為按下第二次剛好抵消第一次,等於沒有按。

這個問題可以轉化成數學問題。

乙個燈的布局可以看成乙個0、1矩陣。以3x3為例:

0 1 0

1 1 0

0 1 1

表示乙個布局。其中0表示燈滅,1表示燈亮。

每次按下按鈕(poj1222)或者叫乙個宿舍關燈(0998),可以看成在原矩陣上加(模2加,就是按位異或)上乙個如下的矩陣:

0 1 0

1 1 1

0 1 0

上述矩陣中的1表示按下第2行第2列的按鈕時,作用的範圍。如果按左上角的按鈕,就是:

1 1 0

1 0 0

0 0 0

我們記l為待求解的原始布局矩陣。a(i,j)表示按下第i行第j列的按鈕時的作用範圍矩陣。在上述例子中,

l=0 1 0

1 1 0

0 1 1

a(1,1)=

1 1 0

1 0 0

0 0 0

a(2,2)=

0 1 0

1 1 1

0 1 0

假設x(i,j)表示:想要使得l回到全滅狀態,第i行第j列的按鈕是否需要按下。0表示不按,1表示按下。那麼,這個遊戲就轉化為如下方程的求解:

l + x(1,1)*a(1,1) + x(1,2)*a(1,2) + x(1,3)*a(2,3) + x(2,1)*a(2,1) + ... + x(3,3)*a(3,3) = 0

其中x(i,j)是未知數。方程右邊的0表示零矩陣,表示全滅的狀態。直觀的理解就是:原來的l狀態,經過了若干個a(i,j)的變換,最終變成0:全滅狀態。

由於是0、1矩陣,上述方程也可以寫成:

x(1,1)*a(1,1) + x(1,2)*a(1,2) + x(1,3)*a(2,3) + x(2,1)*a(2,1) + ... + x(3,3)*a(3,3) = l

這是乙個矩陣方程。兩個矩陣相等,充要條件是矩陣中每個元素都相等。將上述方程展開,便轉化成了乙個9元1次方程組:

簡單地記做:aa * xx = ll

這個方程有唯一解:

x(1,1) x(1,2) x(1,3)

x(2,1) x(2,2) x(2,3)

x(3,1) x(3,2) x(3,3)

=1 1 1

0 0 0

0 0 1

也就是說,按下第一行的3個按鈕,和右下角的按鈕,就能使l狀態變成全滅狀態。

對於固定行列的陣列來說,aa矩陣也是確定的。是否存在解,解是否唯一,只與aa矩陣有關。對於唯一解的情形,只要將ll乘以aa的逆矩陣即可。具體求aa的逆矩陣的方法,可以用高斯消元法。

a[i][j]為1當且僅當且僅當第j個燈變化會影響到第i個燈變化。b[i] = 1表示第i個燈開始時不是

關著的(即第i個燈最後的結果是要變化)。

以上轉此題可以通過列舉第一行的狀態,然後推下一行使前一行全滅的態,直到最後一行,如果最後一行全滅則此種法可以

貼自己**

#include #include #include #include #include #include#include#include#include#includeusing namespace std;

int ma[10][10],a[40][40],ans[40];

void init()

if(i+1<5)

if(j-1>=0)

if(j+1<6)

}}int gauss(int epu,int var)

{ int i,j,k,col;

int max_r;

// num=0;

for(k=0,col=0;ka[max_r][col])

max_r=i;

if(a[max_r][col]!=0)

{ if(max_r!=k)

{ for(i=col;i

poj 1222 高斯消元

第一次寫高斯消元 題意很簡單 就是是全部燈變暗,一盞燈開關會使周圍的燈變化,初始狀態給了。每盞燈就是乙個x a就是相關關係 就是求 ax b 的解 自己寫的模版有點搓,可以去別的文章去看看 優美點的 include include include include include using name...

高斯消元 poj 1222

高斯消元求唯一解集x 關鍵是初始化構造係數矩陣,有了增廣矩陣套模板即可 poj 1222 高斯消元 題意 類似於翻轉棋,按一下上下中左右翻轉,給定初始狀態,問回到全0的狀態的按鍵方案 思路 對於每個位置,倒著想,初始為0,上下中左右加起來為初始狀態,每乙個位置皆如此。30個位置,30個變數,30個方...

Poj 1222 高斯消元

校賽預選卡了一道高斯消元的題,找到資料學習了下,a個模板題熟練熟練。寫錯乙個數字坑了好久,悲催。題意 給定5 6的燈陣,0為關1為開,每次開關 x,y 會同時開關 x 1,y x 1,y x,y 1 x,y 1 四燈 出界不予討論即可 給定初始燈陣,求使所有燈都關閉的開燈方法。分析 從上往下從左往右...