演算法1 列舉法解決熄燈問題

2021-10-25 05:29:30 字數 2677 閱讀 4848

北大郭煒老師:程式與演算法(二)

有乙個由按鈕組成的矩陣,其中每行有6個按鈕,共5行。每個按鈕的位置上有一盞燈。當按下乙個按鈕後,該按鈕以及周圍位置(上邊、下邊、左邊、右邊)的燈都會改變一次。即,如果燈原來是點亮的,就會被熄滅;如果燈原來是熄滅的,則會被點亮。在矩陣角上的按鈕改變3盞燈的狀態;在矩陣邊上的按鈕改變4盞燈的狀態;其他的按鈕改變5盞燈的狀態。

請你寫乙個程式,確定需要按下哪些按鈕,恰好使得所有的燈都熄滅。根據上面的規則,我們知道

1)第2次按下同乙個按鈕時,將抵消第1次按下時所產生的結果。因此,每個按鈕最多隻需要按下一次;

2)各個按鈕被按下的順序對最終的結果沒有影響;

3)對第1行中每盞點亮的燈,按下第2行對應的按鈕,就可以熄滅第1行的全部燈。如此重複下去,可以熄滅第1、2、3、4行的全部燈。同樣,按下第1、2、3、4、5列的按鈕,可以熄滅前5列的燈。

輸入5行組成,每一行包括6個數字(0或1)。相鄰兩個數字之間用單個空格隔開。0表示燈的初始狀態是熄滅的,1表示燈的初始狀態是點亮的。

輸出5行組成,每一行包括6個數字(0或1)。相鄰兩個數字之間用單個空格隔開。其中的1表示需要把對應的按鈕按下,0則表示不需要按對應的按鈕。

樣例輸入

0 1 1 0 1 0

1 0 0 1 1 1

0 0 1 0 0 1

1 0 0 1 0 1

0 1 1 1 0 0

樣例輸出

1 0 1 0 0 1

1 1 0 1 0 1

0 0 1 0 1 1

1 0 0 1 0 0

0 1 0 0 0 0

看到這道題後,想起了剛學c語言時八皇后的問題,然後就對這道題產生了興趣。

解題規則郭煒老師在一開始就說了

1.每個按鈕按一次即可

2.順序對結果無影響

3.對第1行中每盞點亮的燈,按下第2行對應的按鈕,就可以熄滅第1行的全部燈。如此重複下去,可以熄滅第1、2、3、4行的全部燈。同樣,按下第1、2、3、4、5列的按鈕,可以熄滅前5列的燈。

解題的關鍵就在於第三點

這道題如果我每種情況都列舉出來的話,一共是232種,顯然是不合理的,而第三種規則告訴了我們這裡只用列舉第一行26種情況即可。

我們用兩列燈來舉個簡單的例子

假如為0 0 1 1 0 1

0 1 1 0 1 1

首先列舉第一種情況,即按下第一行第一列的燈,然後就變成了:

1 1 1 1 0 1

1 0 1 0 1 1

這種情況下我要想最後第一行第一列的燈為0的話,那麼我一定要按下第二行第一列的燈,即第二行的燈是否要被按下是受第一行所控制的,同理,第三行也受第二行的控制,這樣依次推下去我們會發現,後面幾行燈是否被按下,全部受第一行控制,所以在列舉時只需要列舉出第一行的所有情況即可。

在進行列舉的時候,為了減少時間和空間開銷,我們可以將二維陣列轉化為一維陣列

因為二維資料每個位置的值只能是0或者1

假如第一行為 0 0 1 1 0 1,那麼我們新建的一維陣列的第一位的值就為13,每次更改的時候採用位運算就行了,這裡不做過多描述

首先寫出三個函式方便待會使用

//輸入的時候用到

int getbit (

char c,

int i)

//將c的第i位設定為v

char setbit (

char c,

int i,

int v)

//翻轉c的第i位

char

flipbit

(char c,

int i)

//輸出

void

outputresult

(char result)

}

完整**如下

#include

int getbit (

char c,

int i)

//設定

char setbit (

char c,

int i,

int v)

//翻轉

char

flipbit

(char c,

int i)

void

outputresult

(char result)

}int

main()

}for

( n=

0;n<

64;n++)}

if(i<4)

light_chage[i+1]

^=switchs;

//確定下一行燈的狀態

switchs=light_chage[i]

;//確定下一行開關狀態 }if

(!light_chage[4]

)//輸出答案

}return0;

}

演算法學習從今天開始把

作為乙個基礎差到爆的小白

希望能通過演算法學習在年底的csp考試中能夠取得乙個不讓我掛科的成績

p大的這門演算法課能幫我補一下落後的東西

刷點力扣和哈斯特oj的題

慢慢來吧

wtcl xd

演算法入門 1 列舉法。

以下都是通過列舉法解決問題的。其實列舉法的本質就是把所有問題可能的結果都嘗試一邊,再通過某種條件將錯誤的結果篩選出去,留下的便是正確的結果。輸出乙個直角三角形,符合 注釋中的那個三角形格式。輸出乙個個三角形 輸入 5 輸出的是乙個五行的三角形 第一行 1個 第二行 2個 第五行五個 第一步 我們需要...

演算法基礎(1) 列舉

列舉在大家看來可能是乙個非常簡單的問題,不就是乙個遍歷演算法嘛,有什麼好說的,然而,在參加了北京大學mooc的演算法基礎後,我直接被震驚了。原來列舉演算法還能這麼玩!好吧,不說有的沒得沒得了,先來看第乙個例子 熄燈問題 這個問題的描述如下 乙個由按鈕組成的矩陣,其中每行有6個按鈕,共5行。每個按鈕的...

基礎演算法2 1 列舉法

題目上新增了超連結,大家點一下題目就會自動跳轉到poj原題介面 冲鸭衝鴨 列舉法由於建模簡單,所以用來提高 實現能力十分合適,暴力搜尋ac題時成就感也是滿滿,而且列舉法應該是之後所有演算法的基礎。我覺得部分演算法的本質只是解決了如何列舉以及對列舉的優化。大家放心起航吧!本章節弄懂題意就可以做,所以就...