95 費解的開關(位運算列舉

2021-09-26 04:28:35 字數 1670 閱讀 5739

你玩過「拉燈」遊戲嗎?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個字元。每組資料描述了乙個遊戲的初始狀態。各組資料間用乙個空行分隔。

輸出格式

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

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

資料範圍

011101

11101

11110

11111

11111

01111

11111

11111

11111

11111

輸出樣例:

**思路:** poj這道題的簡化版,只需要確定第一行的狀態,其他行的狀態就確定了,然後列舉取最小即可。

#include

#include

#include

#include

#include

#include

using

namespace std;

#define inf 0x3f3f3f3f

int a[10]

[10],tmp[10]

[10];

int dirx=

;int diry=

;void

swap

(int x,

int y)}}

intsolve

(int sta)

}int ans =0;

for(

int i =

0;i <

5;i++)}

for(

int i =

1;i <

5;i++)}

}for

(int i =

0;i <

5;i++)}

}return ans;

}int

main()

}for

(int i =

0;i <(1

<<5)

;i++)if

(ans >6)

cout <<-1

<< endl;

else cout << ans << endl;

}return0;

}

AcWing95 費解的開關 列舉 位運算

這道題的確比較難想,首先我們知道圖比較小,有可能是列舉,那麼該如何列舉呢?你可以發現,我們只要把第一排定了,並且保證第一排不准動,那麼答案就定了 也就是說,我們首先用二進位制列舉,列舉第一行需要翻轉的,然後讓第一行不准再翻轉,後面的翻轉只能在第二行進行,那麼第二翻轉的實際上是定好了的,然後因為定好了...

AcWing95 費解的開關 列舉 位運算

這道題的確比較難想,首先我們知道圖比較小,有可能是列舉,那麼該如何列舉呢?你可以發現,我們只要把第一排定了,並且保證第一排不准動,那麼答案就定了 也就是說,我們首先用二進位制列舉,列舉第一行需要翻轉的,然後讓第一行不准再翻轉,後面的翻轉只能在第二行進行,那麼第二翻轉的實際上是定好了的,然後因為定好了...

95 費解的開關

簡單來說,這道題目是求我們最少需要多少步可以將所有的燈都開啟,也就是將矩陣全部變為1。對於我們開燈其實是有兩個屬性 1 開燈的順序是無所謂的 2 乙個格仔最多隻需要按一次 對於乙個5 5的矩陣,我們可以把每一行看作一串二進位制數,那麼我們就可以使用二進位制來表示當前這一行的所有按開關或不按開關的組合...