一,題意:
該題是中文提,題意我就不解釋了。
二,解析:
該題我們先的建立乙個圖,我們以開關為節點,若開關x的變化會影響y開關,則連一條x到y的有向邊。
然後我們用鄰接矩陣來儲存該圖。則鄰接矩陣中0表示不影響,1表示反轉。
例如:樣例一, 開始狀態為 :begin = [ 0 0 0 ] 最終狀態為:end = [ 1 1 1 ] 圖的矩陣為:
對角線為1的原因是當你改變某乙個節點是除了與他相鄰的節點要反轉外,其自身也要變。
將矩陣每一列想象為乙個開關按下後產生的效果(1表示狀態翻轉,0表示不變)
即:將每一列最上面想象有乙個開關,如圖
其中x1,x2,x3 只能取 0或1,因為取2的效果與取0的效果是一樣的。
x1=1表示將開關1取反。 x1=0表示不對開關1做操作。
所以我要求的就是 [ x1 x2 x3]有多少種情況。
我們令:x=[ x1,x2,x3 ]。關係矩陣 a=[ a1,a2,a3 ]。a1為列向量。
由上面公式可知,b1為開關1的變化次數,b2為開關2變化次數。
而起點 begin 到終點 end 的變化就是 begin^end 即 begin ^ end = b
所以就是解線性方程組(如圖):求期解的個數。
解該方程 我們用到高斯消元演算法,至於高斯消元就是利用矩陣來解方程組,但是每次
被選取為主元的是一定是最大值。這是為了減少誤差。至於利用矩陣來解方程是線性代數
上的內容,,這裡就不多說。
**:
#include #include #include using namespace std;
int b[35];//狀態變化陣列
int a[35][35];//運算的矩陣
void gaussian(int n)
{//對n*(n+1)的增廣矩陣做初等行變換
for (int r=0,col=0; r
POJ 1830 開關問題 高斯消元
開關問題 time limit 1000ms memory limit 30000k total submissions 3390 accepted 1143 description 有n個相同的開關,每個開關都與某些開關有著聯絡,每當你開啟或者關閉某個開關的時候,其他的與此開關相關聯的開關也會相應...
poj 1830 開關問題 高斯消元
題意是 給一些開關的初始狀態 0 或1 在給出終止狀態,在給出相關的變化規則,規則 x 變化 則 y 也變 x y 讀入。輸出有多少種開關的撥動情況,使初始狀態變成終止狀態。此問題 很容易轉化成 高斯消元 解 異或方程組。t 方程組的自由化的個數,則結果就是 2 t include include ...
poj 1830 開關問題(高斯消元)
終止狀態是從初始狀態由開關組合影響而形成的,那麼就有乙個等式使得初始狀態可以到達終止狀態,例如a,b,c三個開關 e a xa mp a a xb mp a b xc map a c s a e b xa mp b a xb mp b b xc map b c s b e c xa mp c a x...