演算法競賽高階指南 費解的開關

2021-09-10 01:17:43 字數 1479 閱讀 8562

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

0很久沒遇到這種輸入是不空格的整數的情況了,應該轉化為char陣列

狀態壓縮列舉第一行所有可能的情況

從第二行到第五行遞推,每一行都是根據上一行的情況判斷收否要開燈

由第五行是否全開燈判斷是否是正確的可能

#include

#include

using namespace std;

const

int inf =

0x3f3f3f3f

;char g[10]

[10];

int next[5]

[2]=

;void

turn

(int x,

int y)

}int

work()

}for

(int i =

0; i <

4; i ++)}

} bool flag = true;

for(

int j =

0; j <

5; j ++)}

if(flag) ans =

min(ans, res)

;memcpy

(g, backup,

sizeof g);}

if(ans >

6) ans =-1

;return ans;

}int

main()

return0;

}

演算法競賽高階指南 0x02 費解的開關

因為這題是第一題 其實不是第一題 以為比較簡單,一眼暴力,256。算的時候少算了一位,以為規模是1e7,導致樣例都算很慢,慢到我以為是死迴圈。找了半天死迴圈才發現這個 其實能出結果.然後就按照普通的翻轉問題一行一行處理。惡臭,而且有一處變數名寫錯查了半個多小時。下面標出錯誤的地方 include i...

演算法競賽高階指南 0x02 D 費解的開關

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

《演算法競賽高階指南》 防曬

有c頭奶牛進行日光浴,第i頭奶牛需要minspf i 到maxspf i 單位強度之間的陽光。每頭奶牛在日光浴前必須塗防曬霜,防曬霜有l種,塗上第i種之後,身體接收到的陽光強度就會穩定為spf i 第i種防曬霜有cover i 瓶。求最多可以滿足多少頭奶牛進行日光浴。輸入格式 第一行輸入整數c和l。...