5.有乙個由按鈕組成的矩陣,其中每 行有6個按鈕,共5行。每個按鈕的位置上有一盞燈。當按下乙個按鈕後,該按鈕以及周圍位 置(上邊、下邊、左邊、右邊)的燈都會改變一次。即,如果燈原來是點亮的,就會被熄滅; 如果燈原來是熄滅的,則會被點亮。
在矩陣角上的按鈕改變3盞燈的狀態
在矩陣邊上的按鈕改變4盞燈的狀態
其他的按鈕改變5盞燈的狀態
在上圖中,左邊矩陣中用x標記的按鈕表示被按下,右邊的矩陣表示燈狀態的改變,對矩陣中的每盞燈設定乙個初始狀態。請你按按鈕,直至 每一盞等都熄滅。與一盞燈毗鄰的多個按鈕被按下時,一 個操作會抵消另一次操作的結果。在下圖中,第2行第3、5 列的按鈕都被按下,因此第2行、第4列的燈的狀態就不改變
輸入:第一行是乙個正整數n,表示需要解決的案例數。每個案例由5行組成,每一行包括6 個數字。這些數字以空格隔開,可以是0或1。0 表示燈的初始狀態是熄滅的,1表示燈的初始狀態是點亮的。
輸出:對每個案例,首先輸出一行,輸出字元 串「puzzle #m」,其中m是該案例的序號。接著按照該案例的輸入格式輸出5行,其中的1表示需要把對應的按鈕按下,0則表示不需要按對應的按鈕。每個數字以乙個空格隔開。
第2次按下同乙個按鈕時,將抵消第1次按下時所產生的結果。因此,每個按鈕最多隻需要按 下一次。各個按鈕被按下的順序對最終的結果沒有影響對第1行中每盞點亮的燈,按下第2行對應的按鈕,就可以熄滅第1行的全部燈。如此重複下去,可以熄滅第1、2、3、4行的全部燈。
適用於一行有n個按鈕的辦法:
乙個6位二進位制數的所有取值正好是64種,讓該數的每一位對應於answitch[0]裡的乙個元素(answitch[0][5] 對應最高位,answitch[0][4]對應次高位….. ),那麼這個二進位制數的每個取值正好表示了第一行按鈕的一種狀態。
0 的二進位制表示形式是00 0000,即代表所有按鈕都不按下
63 的二進位制表示形式是11 1111,即代表所有按鈕都按下
5 的二進位制表示形式是00 00101,即代表右數第1,3個按鈕按下
如果一行有n個按鈕,那麼就用乙個n位二進位制數
列舉過程:
要寫乙個從二進位制數到狀態的轉換函式:
void switchstatus( int n, int * pswitch);
該函式將整數n( 0 => i ) & 1;}
程式框架:
#include
#include
#include
using namespace std;
int t; int anpuzzle[6][6];
int anoripuzzle[5][6];
int answitch[6][6]; //按鈕狀態
int i,j;
void outputresult(int t) //輸出結果
cout << endl;}}
bool bok = true; //記錄最後一行燈是不是全滅
//看最後一行燈是不是全滅
for( k = 0; k < 6; k ++ )
}if( bok )
} // for( int n = 0; n < 64; n ++ )}}
C 之練習題32
1.數根可以通過把乙個數的各個位上的數字加起來得到。如果得到的數是一位數,那麼這個數就是數根。如果結果是兩位數或者包括更多位的數字,那麼再把這些數字加起來。如此進行下去,直到得到是一位數為止。比如,對於24 來說,把2 和4 相加得到6,由於6 是一位數,因此6 是24 的數根。再比如39,把3 和...
C 之練習題41
1.把 m 個同樣的蘋果放在n 個同樣的盤子裡,允許有的盤子空著不放,問共有多少種不同的分法?用k 表示 注意 5,1,1 和1,5,1 是同一種分法。輸入資料 第一行是測試資料的數目t 0 t 20 以下每行均包含兩個整數m 和n,以空格分開。1 m,n 10。輸出要求 對輸入的每組資料m 和n,...
C 之練習題42
1.在遙遠的國家佛羅布尼亞,嫌犯是否有罪,須由陪審團決定。陪審團是由法官從公眾中挑選的。先隨機挑選n 個人作為陪審團的候選人,然後再從這n 個人中選m 人組成陪審團。選m 人的辦法是 控方和辯方會根據對候選人的喜歡程度,給所有候選人打分,分值從0 到20。為了公平起見,法官選出陪審團的原則是 選出的...