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