POJ 1753 開關問題 高斯消元法

2021-09-08 10:31:31 字數 1546 閱讀 2606

題目鏈結

題目大意:一堆格仔,或白或白。每次可以把乙個改變乙個格仔顏色,其上下左右四個格仔顏色也改變。問最後使格仔全部白或全部黑,求最小改變的格仔樹。

解題思路

與poj 1681 類似。不過這次是或黑或白,要初始化兩次相反的解向量,

進行兩次高斯消元,取其中小的值。

特殊的是,本題中有自由變元的存在,也就是說這個格仔可黑可白,對結果沒有影響。

這時候就會存在無窮解。其實poj 1681也可能存在自由變元,不過資料略水,沒處理也能a掉。

如果不對自由變元處理,那麼我們只會處理一種解,所以某些情況答案是不對的。

自由變元的處理變化參照模板,渣渣暫時看不懂。

#include "

cstdio

"#include

"iostream

"#include

"cstring

"using

namespace

std;

int ratio[20][20],mat[20],freex[20],x[20],dir[5][2]=,t,n;

void

reset()

}int

gauss()

for(k=i+1;k)

}k=i;

for(i=k; i)

if(ratio[i][n*n]) return -1

;

int bit=1

<<(n*n-k),ans=0x3f3f3f3f

;

for(int t=0;t)

for(i=k-1; i>=0; i--)

ans=min(ans,cnt);

}return

ans;

}int

main()

if(c[j]=='

b') }}

int ok=gauss();

if(ok!=-1) ans=min(ans,ok);

memset(ratio,

0,sizeof

(ratio));

memset(freex,

0,sizeof

(freex));

memset(x,

0,sizeof

(x));

for(int i=0;imat[i];

reset();

ok=gauss();

if(ok!=-1) ans=min(ans,ok);

if(ans==0x3f3f3f3f) printf("

impossible\n");

else printf("

%d\n

",ans);

}

13602643

neopenx

1753

accepted

160k

16ms

c++2170b

2014-11-05 18:35:15

POJ 1753 高斯消元

題意是把所有的字母都變成w或者b的最小步數.跑兩次01方程,取最小如果兩次都無解就輸出無解.板子題 include include include include include using namespace std define maxn 333 define free free define ...

高斯消元(poj1753

參考了kuangbin的部落格,注意自由變元那邊 include include include include includeusing namespace std const int maxn 30 const int inf 0x3fffffff int a maxn maxn 增廣矩陣 in...

poj 1753 Flip Game 高斯消元

因為目標狀態是全白或全黑,所以進行兩次高斯消元,每次若有自由變元的話要列舉自由變元求得最優解。哇哦,怎麼就寫了200 行。include include include include include include include include include include include i...