費解的開關

2022-05-09 16:03:14 字數 2313 閱讀 8700

題目先將兩個比較重要的性質:

對於乙個按鈕,不可能按兩次,按兩次就等於不按。

按按鈕的順序不會影響最終結果。(也就是無序)

至於為什麼,可以結合位運算來思考,在此不多講了。

仍然分成做法1和做法2。

沒錯,我的做法就是暴力,傳統藝能。

為了節省空間,我把\(1\)設為燈是暗的,\(0\)是亮的。(實際上並沒有節省)

然後就變成了我們要讓圖全部變成\(0\)了,但是我們發現這個操作是可逆的,如果\(x\)能花\(5\)步變成\(y\),那\(y\)也能花\(5\)步變成\(x\),重點是資料範圍是\(5*5\)的,而\(2^-1=33554431\),那麼我們就可以直接用乙個\(int\)來反映整個圖的開關情況了,然後我們預處理出\(0\)狀態到\(x\)狀態所需要的步數就行了,對於超過\(6\)步的就不理他了。

當然我還有乙個性質不知道怎麼證的,只是覺得他是對的,但是不會證,但我也用了因為我找不出反例。(其實不用改成min就行了)

對於每個按鈕,不可能通過按其他的按鈕來實現這個按鈕的功能,這意味著\(0\)到每個圖所需要按的按鈕是唯一的。

時間複雜度:\(o(c_^+n)\)

#include#include#define  n  41000000

using namespace std;

int a[n];

inline int close(int x/*狀態*/,int k/*位置*/)

void dfs(int k/*表示狀態*/,int t/*表示這次是第幾次開燈了*/,int x/*這是決定在**開燈的*/)

int main()

} if(x==0)printf("0\n");

else if(a[x]==0)printf("-1\n");

else printf("%d\n",a[x]);

} return 0;

}

奆佬就是奆佬,惹不起惹不起。

果然,不出所料。

部落格中奆佬給出了一種時間複雜度更好看的做法(當然這個做法更吃按鈕方案唯一這個性質,但是我還是不會證qaq,但是感覺是對的)。

這個做法要從我們看這個開關的角度來看了,開關是乙個「十」字的構造,題目中是說點中間影響四周,但是我們可以看成我們點了上面的開關,影響了下面四個開關,這樣子看的話,我們點開關的時候就可以一層層向下推進了。

但是這樣存在兩個問題。

不是最少的點選次數,例如:

000101

111如果按照這種方法按的次數是遠大於\(3\)的,而且題目中都說了我們按了中間影響了四周,所以我們必須要考慮第一行是中間的情況,對於這種情況,奆佬選擇了直接暴力列舉操作序列,比如我列舉到了\(00110\),說明我會按3、4號開關,但是這會花費\(2^5\)的代價足足32啊,四捨五入就是乙個億啊,然後再按這個做法做,就解決了這種情況。

不能完美的把圖變成\(0\)。

如:000

101111

我們用我們的方法處理第一行:

111111

000第二行不用處理了,但到了第\(3\)行,我們就不能用這個方法了,因為我們其實只是把按按鈕換了個角度看,實際位置並沒變,如果我們按那個方法接著做,那麼按開關的實際位置就是在第\(4\)行了。

而且這也恰巧為按鈕方案唯一這個提供了有力的證據,第乙個問題是不是最少的點選次數,但是根據這個性質理論上來講只存在乙個點選次數啊,所以這個問題就說明了,這種方式構造出的方案不僅點選次數多,而且還是錯誤。

至於解決的方法,就是不讓最後一行參與到這個方法中,同時在做完之後看看圖是否滿足要求就行了。(其實只用檢查最後一行)

時間複雜度:\(o(2^5*5^2*n)\)

**採用:

#include using namespace std;

int n,m,i,j,k,a[7][7],ans1=1e6,b[7][7];//7,7是因為怕在最後一排溢位

int main()

getchar();

}for (i=0;i<=(1<<5);i++)//模擬第一行的操作序列

int ans=0;

for (j=1;j<=5;j++)

if (i>>(j-1) & 1)

for (j=1;j<=4;j++)//切記是1~4,而不是2~5,因為我們是控制i+1行,而不是控制第i行

for (k=5;k>=1;k--)

if (!a[j][k])

//cout<6)

cout<<-1;

else

cout

puts("");

}return 0;

}

費解的開關

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

費解的開關

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

費解的開關

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