費解的開關

2021-10-23 00:26:05 字數 1341 閱讀 8068

本題可通過遞推解決。其思路是這樣的:由於每按乙個燈就會導致上下左右的燈取反,所以如果想讓當前某個燈變亮的話,決不能直接按它,而是通過下一行與它同列的燈間接使它變亮。

第i+1行依賴於第 i 行的燈的情況,如果第 i 行是能遞推通往正確結果(即全亮)的,那麼該行為0的位,應該由第i+1行給調回來。

所以第1行是一切的基礎,需要對第一行燈按與不按(而不是亮與不亮)的32中情況逐一列舉,用二進位制數k表示,哪一位為1表示要按哪一位

值得注意的是,第一行燈況不是隨便的,得滿足特定條件,這種情況才能遞推為全亮狀態。所以,我們需要對第一行的所有燈況進行列舉,通過k就可以不重不漏的組合出所有的按鍵情況,進而得出所有的燈況。

對第一行的32中燈況逐一遞推,如果到第5行時,所有的燈都是亮的,那麼這種燈況是合理的,要小心可能有多種燈況都能達到最終全亮的狀態,所以需要找到按鍵次數最少的。

#include

#include

#include

#define inf (~(0x1 << 31))

using

namespace std;

int n;

char gra[5]

[5];

int dx[5]

=, dy[5]

=;void

turn

(int x,

int y)}}

void

work()

}//假設第一種情況可以通往最後全1結果

for(

int i =

0; i <

4; i++)}

}//檢查最後一行的狀態,如果遞推成功的話,最後一行應該是全1的

bool flag =

false

;for

(int i =

0; i <

5; i++)}

memcpy

(gra, backup,

sizeof backup)

;//還原if(

!flag)}if

(ans >6)

else

}int

main()

}work()

;}return0;

}

費解的開關

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

費解的開關

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

費解的開關

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