熄灯问题——全代码
1 #include <iostream>
2 #include <cstring> //memset(),memcpy頭文件
3 using namespace std;
4
5 //獲取第j位
6 int Getbit(int num,int j)
7 {
8 return (num >> j)&1;
9 }
10 //設置第j位
11 void Setbit(char& num,int j, int s)
12 {
13 if(s)
14 num |= (1 << j);
15 else
16 num &= ~(1 << j);
17 }
18 //反轉第j位
19 void Flipbit(char& num,int j)
20 {
21 num ^= (1 << j);
22 }
23
24 int main(int argc,char* argv[])
25 {
26 char orilight[5];//原始燈狀態
27 char curlight[5];//當前燈的狀態
28 char result[5]; //結果
29 int switchs; //開關狀態
30 bool flag = false;//判斷是否有結果
31
32 //初始化原始燈狀態
33 memset(orilight,0,sizeof(orilight));
34 for(int i = 0;i < 5;++i)
35 for(int j = 0;j < 6;++j)
36 {
37 int single;
38 cin >> single;
39 Setbit(orilight[i],j,single);
40 }
41 //確定結果
42 for(int n = 0;n < 64;++n)
43 {
44 switchs = n;
45 memcpy(curlight,orilight,sizeof(orilight));//每執行一次枚舉就將原始燈的狀態存到當前燈矩陣中
46 //以保證每次測試結果都不會改變原始狀態
47 //處理每一行燈的狀態
48 for(int i = 0;i < 5;++i)
49 {
50 result[i] = switchs;
51 for(int j = 0;j < 6;++j)
52 {
53 if(Getbit(switchs,j))
54 {
55 if(j > 0)
56 Flipbit(curlight[i],j - 1);
57 Flipbit(curlight[i],j);
58 if(j < 5)
59 Flipbit(curlight[i],j+1);
60 }
61 }
62 //處理第i+1行燈的狀態
63 if(j < 4)
64 curlight[i+1] ^= switchs;
65 switchs = curlight[i];
66 }
67 //當第五行的燈熄滅時,找到結果
68 if(curlight[4] == 0)
69 {
70 flag = true;
71 break;
72 }
73 }
74 if(flag)
75 {
76 for(int i = 0;i < 5;++i)
77 {
78 for(int j = 0;j < 6;++j)
79 {
80 cout << Getbit(result[i],j) << " ";
81 }
82 cout << endl;
83 }
84 }
85 else
86 cout << "no anwser" << endl;
87
88 return 0;
89 }
補充:對于所需要的枚舉次數,我們可以這樣計算:因為我們只需要枚舉第一行的燈的狀態,而第一行有6盞燈,所以全排列就是26種,即我們只需枚舉64次。
? 當然,我們也可以枚舉更少的次數,也就是只枚舉32次(25),按列來枚舉,這種方法可以考慮使用大小為6的char數組,每個數組存一列,其他過程
? 如按行枚舉。
轉載于:https://www.cnblogs.com/heisen/p/8933696.html
總結
- 上一篇: 远程Service的显示 / 隐式启动
- 下一篇: k-Means算法(Machine Le