費解的開關 高斯消元

2021-09-29 07:21:02 字數 2562 閱讀 7331

費解的開關

你玩過「拉燈」遊戲嗎?25盞燈排成乙個5x5的方形。每乙個燈都有乙個開關,遊戲者可以改變它的狀態。每一步,遊戲者可以改變某乙個燈的狀態。遊戲者改變乙個燈的狀態會產生連鎖反應:和這個燈上下左右相鄰的燈也要相應地改變其狀態。

我們用數字「1」表示一盞開著的燈,用數字「0」表示關著的燈。下面這種狀態

10111

01101

10111

10000

11011

在改變了最左上角的燈的狀態後將變成:

01111

11101

10111

10000

11011

再改變它正中間的燈後狀態將變成:

01111

11001

11001

10100

11011

給定一些遊戲的初始狀態,編寫程式判斷遊戲者是否可能在6步以內使所有的燈都變亮。

輸入描述:

第一行有乙個正整數n,代表資料中共有n個待解決的遊戲初始狀態。

以下若干行資料分為n組,每組資料有5行,每行5個字元。每組資料描述了乙個遊戲的初始狀態。各組資料間用乙個空行分隔。

對於30%的資料,n≤5;

對於100%的資料,n≤500。

輸出描述:

輸出資料一共有n行,每行有乙個小於等於6的整數,它表示對於輸入資料中對應的遊戲狀態最少需要幾步才能使所有燈變亮。

對於某乙個遊戲初始狀態,若6步以內無法使所有燈變亮,請輸出「-1」。

輸入

3

00111

01011

10001

11010

11100

11101

11101

11110

11111

11111

01111

11111

11111

11111

11111

輸出

3

2-1

乙個點最多操作一次,k

xk_x

kx​表示x點操作的次數,只能為1/0,a,b,c,d分別是x旁邊的四個點

則有:axk

x⊕aa

ka⊕a

bkb⊕

ackc

⊕adk

d=!v

xa_xk_x \oplus a_ak_a \oplus a_bk_b \oplus a_ck_c \oplus a_dk_d=!v_x

ax​kx​

⊕aa​

ka​⊕

ab​k

b​⊕a

c​kc

​⊕ad

​kd​

=!vx

​k就是所求變數,min

(∑ki

)min(\sum k_i)

min(∑k

i​)即為答案

a是係數,所以可以消元,消元之後不一定有唯一解,可能有多個自由變元

#include

using

namespace std;

#define init(a,v) memset(a,v,sizeof(a))

#define lowbit(x) (x&(-x))

bool mat[30]

[30];

inline

intnbit

(int x)

return res;

}int

gauss

(int row,

int col)

for(

int r=

1;r<=row;

++r)

}//以上就是正常的消元

int num=0;

//自由變數的個數

for(

int i=

1;i<=row;

++i)

int res[30]

;//自由變元對應的係數(二進位制)

for(

int i=

1;i<=row-num;

++i)

int ans=7;

//列舉自由變數的取值

for(

int i=

0;i<(1

<;++i)

return ans>6?

-1:ans;

}char mp[8]

[8];

int dx=

,dy=

;boolok(

int i,

int j)

intid

(int i,

int j)

intmain()

mat[

id(i,j)][

id(i,j)]=

1;mat[

id(i,j)][

26]=1

-(mp[i]

[j]-48)

;}}printf

("%d\n"

,gauss(25

,26))

;}return0;

}

開關問題 高斯消元

description 有n個相同的開關,每個開關都與某些開關有著聯絡,每當你開啟或者關閉某個開關的時候,其他的與此開關相關聯的 開關也會相應地發生變化,即這些相聯絡的開關的狀態如果原來為開就變為關,如果為關就變為開。你的目標是經過 若干次開關操作後使得最後n個開關達到乙個特定的狀態。對於任意乙個開...

高斯消元 浮點高斯消元

浮點數高斯消元 問題描述 給出乙個線性方程組,有n個方程組,m個未知數。解這個線性方程組。輸入格式 第1行 2個整數n和m,n,m 400,且n不一定等於m 接下來n行,每行m 1個整數,表示乙個方程的m個未知數的係數和常數 輸出格式 如果無解,輸出 no solution 如果有唯一解,輸出m行,...

poj 1830 開關問題(高斯消元(開關問題))

language default 開關問題 time limit 1000ms memory limit 30000k total submissions 6281 accepted 2390 description 有n個相同的開關,每個開關都與某些開關有著聯絡,每當你開啟或者關閉某個開關的時候,...