費解的開關

2022-07-25 04:09:15 字數 1910 閱讀 6592

費解的開關

你玩過「拉燈」遊戲嗎?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_x\)表示x點操作的次數,只能為1/0,a,b,c,d分別是x旁邊的四個點

則有:\(a_xk_x \oplus a_ak_a \oplus a_bk_b \oplus a_ck_c \oplus a_dk_d=!v_x\)

k就是所求變數,\(min(\sum k_i)\)即為答案

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

#includeusing namespace std;

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

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

bool mat[30][30];

inline int nbit(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)

char mp[8][8];

int dx=,dy=;

bool ok(int i,int j)

int id(int i,int j)

int main()

mat[id(i,j)][id(i,j)]=1;

mat[id(i,j)][26]=1-(mp[i][j]-48);}}

printf("%d\n",gauss(25,26));

}return 0;

}

費解的開關

你玩過 拉燈 遊戲嗎?25盞燈排成乙個5x5的方形。每乙個燈都有乙個開關,遊戲者可以改變它的狀態。每一步,遊戲者可以改變某乙個燈的狀態。遊戲者改變乙個燈的狀態會產生連鎖反應 和這個燈上下左右相鄰的燈也要相應地改變其狀態。我們用數字 1 表示一盞開著的燈,用數字 0 表示關著的燈。下面這種狀態 101...

費解的開關

時間限制 1 sec 記憶體限制 128 mb 提交 狀態 題目描述 你玩過 拉燈 遊戲嗎?25盞燈排成乙個5x5的方形。每乙個燈都有乙個開關,遊戲者可以改變它的狀態。每一步,遊戲者可以改變某乙個燈的狀態。遊戲者改變乙個燈的狀態會產生連鎖反應 和這個燈上下左右相鄰的燈也要相應地改變其狀態。我們用數字...

費解的開關

你玩過 拉燈 遊戲嗎?25盞燈排成乙個5x5的方形。每乙個燈都有乙個開關,遊戲者可以改變它的狀態。每一步,遊戲者可以改變某乙個燈的狀態。遊戲者改變乙個燈的狀態會產生連鎖反應 和這個燈上下左右相鄰的燈也要相應地改變其狀態。我們用數字 1 表示一盞開著的燈,用數字 0 表示關著的燈。下面這種狀態 101...