費解的開關(二進位制 搜尋)

2021-09-29 09:49:54 字數 1617 閱讀 2653

題目描述

你玩過「拉燈」遊戲嗎?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」。

樣例輸入

300111

01011

10001

11010

11100

11101

11101

11110

11111

11111

01111

11111

11111

11111

11111

樣例輸出32

-1思路

將整個圖轉化成二進位制,即乙個01串,從全是1的串(即燈全點亮時),向下bfs,獲得所有6步以內的排列,根據輸入判斷答案是否正確。

**實現

#include

#include

using

namespace std;

typedef

long

long ll;

const

int n =

5e7+10;

const ll mod =

1000000007;

unordered_map<

int,

int>vis;

intbuild

(int x,

int p)

void

bfs()}

}}intmain()

printf

("%d\n"

,vis[sum]-1

);}return0;

}```

費解的開關 二進位制記錄狀態

時間限制 1 sec 記憶體限制 128 mb 提交 49 解決 21 提交 狀態 討論版 命題人 admin 題目描述 你玩過 拉燈 遊戲嗎?25盞燈排成乙個5x5的方形。每乙個燈都有乙個開關,遊戲者可以改變它的狀態。每一步,遊戲者可以改變某乙個燈的狀態。遊戲者改變乙個燈的狀態會產生連鎖反應 和這...

二進位制搜尋

轉會 二分查詢演算法基本思想 二分查詢演算法的前置條件是,乙個已經排序好的序列 在本篇文章中為了說明問題的方便,假設這個序列是公升序排列的 這樣在查詢所要查詢的元素時,首先與序列中間的元素進行比較,假設大於這個元素,就在當前序列的後半部分繼續查詢,假設小於這個元素,就在當前序列的前半部分繼續查詢,直...

二進位制 二進位制起源

現代通訊技術的基礎是二進位制編碼。早在1865年麥克斯韋總結出麥克斯韋方程組之前,美國人摩斯 morse 於1837年發明了摩斯電碼和有線電報。有線電報的出現,具有劃時代的意義 它讓人類獲得了一種全新的資訊傳遞方式,這種方式 看不見 摸不著 聽不到 完全不同於以往的信件 旗語 號角 烽火,這也是二進...