《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充)
給定n個數,能否隻通過加減乘除計算得到24?
書上給出的最後一種解法,通過使用集合記錄中間結果來減少備援計算。本以為,程式會占用大量的記憶體,用一個極端的例子(13, 773, 28, 98, 731, 1357,97357246這7個數)測試了一下實作的程式,發現程式竟然占用了1G以上的記憶體(無論集合的實作采用STL中的set還是unordered_set),但後來,取7個均在1到13之間的數,再重新測試了下發現,程式所占用的記憶體比想像的小的多,也就幾兆。
對數值都在1到13之間的n個數的所有組合進行判斷。在n等于4時,實作的程式約過1秒就給出了結果,而n等于5時,程式要運作58秒,效率實在差,可以通過這幾方面優化:
① 儲存每個集合的子集合的編号:
對給定的n,共有1到2^n – 1個集合,每個集合的子集合編号是固定的,但原程式每計算一個n個數的組合,都要對這些子集合編号計算一遍,可以儲存每個集合的子集合編号,減少大量的重複計算。
② 改進計算子集合編号的算法:
原程式的算法的時間複雜度是O(4^n),在n較大時,相當慢。
③ 對最後一個集合是否含有24的判斷:
原程式要周遊該集合所有的元素,效率比較差,可以考慮,在将兩個集合合并到該集合時,隻對取出的兩個元素的計算結果是否為24進行判斷,這樣不僅省去最後的周遊,而且不用将結果插入到最後的那個集合中,省去了大量操作。
采用①和③兩種改進方法後,程式運作時間由原來的58秒縮短到了14秒,但這還不能讓人滿意。對2,3,5,6,8這5個數,如果用書上的第一種方法,可以隻調用4次函數就可以得到結果:2+3+5+6+8=24,但用集合的方法來處理,卻要對所有的集合進行子集合合并後才能給出結果,這造成了效率極差,可以這樣改進該算法:
初始有n個集合:每一次任意取出2個集合,合并後,放回去,再取出任意2個集合,重複前面的操作,直到隻剩下一個集合為止。
例如:初始有5個數,把這5個數分别放到5個集合,并分别編号為:1、2、4、8、16。任意取出2個集合,假設為1和4,将1和4合并,得到編号為5(=1+4)的集合,剩下的集合為:5、2、16、8,再取出2個,假設為5和8,合并後,得到13、2、16,再取2個,假設為13和16,合并後得到29、2,當剩下2個集合時,可以直接對這兩個集合間的的計算結果是否為24進行判斷,直接得出結果,省去不必要的合并(合并後再判斷是否有元素近似等于24,程式運作時間8s多,而直接對計算結果判斷,程式隻要運作1s多)。
優化後的程式,隻要運作1s多。但其效率還是不如書上的第一種方法的改進版,仔細想想,n越大,集合的元素也就越多,兩個集合之間的合并,就越耗時間。而且采用集合儲存中間結果,表面上減少了重複狀态,會提高效率,但實際上,由于采用了集合,就多了很多不必要的計算,(比如,對2+3+5+6+8=24,最少隻要4次計算就能得出結果,采用集合合并後,則要計算幾百次(約為6^4)),再加上實作集合所采用的資料結構的開銷,效率高不了。
《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充)
《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充) 24_set_1
《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充) #include < iostream >
2
《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充) #include < fstream >
3
《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充) #include < unordered_set >
4
《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充) #include < vector >
5
《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充) #include < ctime >
6
《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充) #include < cmath >
7
《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充) using namespace std;
8
《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充) typedef unordered_set < double > mset;
9
《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充) 10
《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充) unsigned long long all_size = 0 ;
11
《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充) unsigned long long big_size = 0 ;
12
《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充) 13
《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充) 14
《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充) bool calc( int src[], size_t N, double M = 24.0 )
15
《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充)
《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充) {
16
《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充) if (N == 0 || src == NULL) return false;
17
《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充) mset result[1 << N];
18
《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充) for (size_t i = 0; i < N; ++i) result[1<<i].insert((double)src[i]);
19
《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充)
《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充) for (size_t i =1; i < (1<<N); ++i) {
20
《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充)
《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充) for (size_t j = 1; j <= (i >> 1); ++j) {
21
《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充) if ((i & j) != j) continue;
22
《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充)
《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充) for (mset::iterator p = result[j].begin(); p != result[j].end(); ++p) {
23
《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充) double va = *p;
24
《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充) size_t k = i ^ j;
25
《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充)
《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充) for (mset::iterator q = result[k].begin(); q != result[k].end(); ++q) {
26
《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充) double vb = *q;
27
《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充) result[i].insert(va + vb);
28
《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充) result[i].insert(va - vb);
29
《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充) result[i].insert(vb - va);
30
《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充) result[i].insert(va * vb);
31
《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充) if (vb != 0.0) result[i].insert(va / vb);
32
《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充) if (va != 0.0) result[i].insert(vb / va);
33
《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充) }
34
《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充) }
35
《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充) }
36
《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充) }
37
《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充) 38
《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充) size_t j = (1 << N) - 1;
39
《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充) all_size=0;
40
《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充) big_size=result[j].size();
41
《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充) for (size_t i =1; i < (1<<N); ++i) all_size += result[i].size();
42
《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充)
《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充) for (mset::iterator p = result[j].begin(); p != result[j].end(); ++p) {
43
《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充) if (fabs(M - *p) < 1e-9) return true;
44
《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充) }
45
《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充) return false;
46
《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充) }
47
《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充) 48
《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充) 49
《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充) void calc_range( int first, int last,size_t N, double M = 24 , string filename = " nul " )
50
《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充)
《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充) {
51
《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充) if (N ==0 || first >= last || filename.empty()) return;
52
《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充) clock_t ta = clock();
53
《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充) vector<int> vv(N, first);
54
《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充) int *end = &vv[N-1], *p = end, *arr = &vv[0];
55
《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充) ofstream ofs(filename.c_str());
56
《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充) size_t count = 0;
57
《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充) size_t count_b = 0;
58
《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充) unsigned long long max_big_size =0, max_all_size = 0;
59
《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充)
《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充) while(true){
60
《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充) ++count_b;
61
《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充)
《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充) if (calc(arr,N, M)) {
62
《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充) ofs.width(4);
63
《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充) ofs<< ++count << " ";
64
《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充)
《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充) for (size_t i = 0; i < N; ++i) {
65
《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充) ofs.width(2);
66
《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充) ofs << arr[i]<< " ";
67
《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充) }
68
《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充) ofs << "\n";
69
《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充) if (max_big_size < big_size) max_big_size = big_size;
70
《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充) if (max_all_size < all_size) max_all_size = all_size;
71
《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充) }
72
《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充) while (p >= arr && *p >= last) --p;
73
《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充) if (p < arr) break;
74
《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充) int tmp = ++*p;
75
《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充) while (p < end) *++p = tmp;
76
《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充) }
77
《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充) ofs.close();
78
《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充) const char sep[] = "/";
79
《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充) cout << "total: " << count << sep << count_b << "\n"
80
《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充) << max_big_size << sep << max_all_size << "\n"
81
《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充) << "time: " << clock() - ta << "\n\n";
82
《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充) }
83
《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充) 84
《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充) int main()
85
《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充)
《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充) {
86
《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充) calc_range(1,13,5,24,"nul");
87
《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充) cin.get();
88
《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充) }
89
《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充)
《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充)
《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充) 24_set_2.cpp
《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充) 2
《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充) #include < iostream >
3
《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充) #include < fstream >
4
《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充) #include < vector >
5
《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充) #include < deque >
6
《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充) #include < unordered_set >
7
《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充) #include < ctime >
8
《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充) #include < cmath >
9
《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充) using namespace std;
10
《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充) 11
《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充) typedef unordered_set < double > MSET;
12
《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充) typedef MSET::iterator MSETI;
13
《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充) typedef deque < size_t > ::iterator DQI;
14
《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充) 15
《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充) const size_t N = 5 ;
16
《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充) const double M = 24 ;
17
《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充) static MSET result[ 1 << N];
18
《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充) // static vector<MSET> result(1<<N);
19
《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充) // static vector<MSET> result(1<<N, MSET(256));
20
《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充) static deque < size_t > dq[ 1 << N];
21
《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充) size_t max_size = 0 ;
22
《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充) 23
《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充) inline void init()
24
《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充)
《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充) {
25
《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充) size_t count = 0;
26
《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充)
《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充) for (size_t i =1; i < (1<<N); ++i) {
27
《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充)
《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充) for (size_t j = 1; j <= (i >> 1); ++j) {
28
《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充) if ((i & j) != j) continue;
29
《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充) dq[i].push_back(j);
30
《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充) ++count;
31
《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充) }
32
《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充) }
33
《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充) cout << "total sets: " << count << "\n";
34
《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充) }
35
《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充) 36
《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充) inline bool isequal_m( double na)
37
《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充)
《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充) {
38
《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充) const double zero = 1e-9;
39
《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充) if (fabs(na - M) < zero) return true;
40
《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充) return false;
41
《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充) }
42
《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充) 43
《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充) bool calc( int src[])
44
《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充)
《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充) {
45
《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充) if (N == 0 || src == NULL) return false;
46
《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充) const size_t ii = (1 << N) - 1;
47
《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充) for (size_t i =1; i <= ii; ++i) result[i].clear();
48
《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充) for (size_t i = 0; i < N; ++i) result[1<<i].insert((double)src[i]);
49
《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充)
《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充) for (size_t i = 1; i < ii; ++i) {
50
《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充)
《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充) for (DQI r = dq[i].begin(), re = dq[i].end(); r != re; ++r){
51
《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充) size_t j = *r;
52
《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充)
《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充) for (MSETI p = result[j].begin(), pe = result[j].end(); p != pe; ++p) {
53
《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充) double va = *p;
54
《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充) size_t k = i - j;
55
《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充)
《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充) for (MSETI q = result[k].begin(),qe = result[k].end(); q != qe; ++q) {
56
《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充) double vb = *q;
57
《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充) result[i].insert(va + vb);
58
《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充) result[i].insert(va - vb);
59
《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充) result[i].insert(vb - va);
60
《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充) result[i].insert(va * vb);
61
《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充)
《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充) if (va != 0 && vb != 0) {
62
《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充) result[i].insert(va / vb);
63
《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充) result[i].insert(vb / va);
64
《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充) }
65
《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充) }
66
《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充) }
67
《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充) }
68
《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充) }
69
《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充) 70
《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充)
《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充) for (size_t j = 1; j < ii; ++j) {
71
《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充) if (max_size < result[j].size()) max_size = result[j].size();
72
《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充) }
73
《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充) 74
《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充)
《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充) for (DQI r = dq[ii].begin(), re = dq[ii].end(); r != re; ++r) {
75
《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充) size_t j = *r;
76
《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充)
《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充) for (MSETI p = result[j].begin(), pe = result[j].end(); p != pe; ++p) {
77
《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充) double va = *p;
78
《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充) size_t k = ii - j;
79
《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充)
《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充) for (MSETI q = result[k].begin(),qe = result[k].end(); q != qe; ++q) {
80
《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充) double vb = *q;
81
《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充) if (isequal_m(va + vb)) return true;
82
《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充) if (isequal_m(va - vb)) return true;
83
《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充) if (isequal_m(vb - va)) return true;
84
《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充) if (isequal_m(va * vb)) return true;
85
《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充)
《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充) if (va != 0 && vb != 0) {
86
《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充) if (isequal_m(va / vb)) return true;
87
《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充) if (isequal_m(vb / va)) return true;
88
《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充) }
89
《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充) }
90
《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充) }
91
《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充) }
92
《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充) return false;
93
《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充) }
94
《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充) 95
《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充) 96
《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充) void calc_range( int first, int last, string filename = " nul " )
97
《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充)
《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充) {
98
《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充) if (N ==0 || first >= last || filename.empty()) return;
99
《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充) clock_t ta = clock();
100
《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充) init();
101
《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充) vector<int> vv(N, first);
102
《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充) int *end = &vv[N-1], *p = end, *arr = &vv[0];
103
《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充) ofstream ofs(filename.c_str());
104
《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充) size_t count = 0;
105
《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充) size_t count_b = 0;
106
《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充)
《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充) while(true){
107
《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充) ++count_b;
108
《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充)
《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充) if (calc(arr)) {
109
《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充) ofs.width(4);
110
《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充) ofs<< ++count << " ";
111
《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充)
《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充) for (size_t i = 0; i < N; ++i) {
112
《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充) ofs.width(2);
113
《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充) ofs << arr[i]<< " ";
114
《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充) }
115
《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充) ofs << "\n";
116
《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充) }
117
《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充) while (p >= arr && *p >= last) --p;
118
《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充) if (p < arr) break;
119
《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充) int tmp = ++*p;
120
《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充) while (p < end) *++p = tmp;
121
《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充) }
122
《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充) ofs.close();
123
《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充) const char sep[] = "/";
124
《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充) cout << "total: " << count << sep << count_b << "\n"
125
《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充) << "max_size: " << max_size << "\n"
126
《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充) << "time: " << clock() - ta << "\n\n";
127
《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充) 128
《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充) }
129
《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充) 130
《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充) int main()
131
《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充)
《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充) {
132
《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充) calc_range(1,13,"nul");
133
《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充) cin.get();
134
《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充) }
135
《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充)
《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充)
《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充) 24_set_3.cpp
《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充) 2
《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充) #include < iostream >
3
《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充) #include < fstream >
4
《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充) #include < vector >
5
《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充) #include < unordered_set >
6
《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充) #include < ctime >
7
《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充) #include < cmath >
8
《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充) using namespace std;
9
《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充) 10
《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充) typedef unordered_set < double > MSET;
11
《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充) typedef MSET::const_iterator MSETI;
12
《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充) 13
《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充) const size_t N = 5 ;
14
《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充) const double M = 24 ;
15
《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充) static MSET result[ 1 << N];
16
《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充) static size_t num[N];
17
《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充) // static vector<MSET> result(1<<N);
18
《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充) // static vector<MSET> result(1<<N, MSET(256));
19
《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充) size_t count_expr = 0 ;
20
《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充) size_t count_func = 0 ;
21
《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充) 22
《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充) bool calc(size_t step);
23
《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充) 24
《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充) bool calc_num( int src[])
25
《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充)
《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充) {
26
《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充)
《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充) if (M <= 1) {
27
《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充) if (M == 1 && src[0] == 24) return true;
28
《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充) return false;
29
《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充) }
30
《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充) for (size_t i = 0, j = 1; i < N; ++i, j *= 2) num[i] = j;
31
《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充) for (size_t i = 1; i < (1 << N); ++i) result[i].clear();
32
《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充) for (size_t i = 0; i < N; ++i) result[1<<i].insert((double)src[i]);
33
《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充) return calc(N);
34
《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充) }
35
《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充) 36
《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充) inline void merge_set(size_t i, size_t j)
37
《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充)
《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充) {
38
《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充) const size_t k = i + j;
39
《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充)
《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充) for (MSETI p = result[i].begin(), pe = result[i].end(); p != pe; ++p) {
40
《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充) double va = *p;
41
《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充)
《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充) for (MSETI q = result[j].begin(),qe = result[j].end(); q != qe; ++q) {
42
《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充) double vb = *q;
43
《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充) result[k].insert(va + vb);
44
《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充) result[k].insert(va - vb);
45
《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充) result[k].insert(vb - va);
46
《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充) result[k].insert(va * vb);
47
《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充)
《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充) if (va != 0 && vb != 0) {
48
《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充) result[k].insert(va / vb);
49
《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充) result[k].insert(vb / va);
50
《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充) }
51
《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充) }
52
《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充) }
53
《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充) }
54
《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充) 55
《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充) inline bool isequal_m( double na)
56
《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充)
《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充) {
57
《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充) const double zero = 1e-9;
58
《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充) if (fabs(na - M) < zero) return true;
59
《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充) return false;
60
《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充) }
61
《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充) 62
《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充) inline bool merge_set2(size_t i, size_t j)
63
《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充)
《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充) {
64
《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充)
《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充) for (MSETI p = result[i].begin(), pe = result[i].end(); p != pe; ++p) {
65
《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充) double va = *p;
66
《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充)
《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充) for (MSETI q = result[j].begin(),qe = result[j].end(); q != qe; ++q) {
67
《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充) double vb = *q;
68
《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充) if (isequal_m(va + vb)) return true;
69
《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充) if (isequal_m(va - vb)) return true;
70
《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充) if (isequal_m(vb - va)) return true;
71
《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充) if (isequal_m(va * vb)) return true;
72
《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充)
《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充) if (va != 0 && vb != 0) {
73
《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充) if (isequal_m(va / vb)) return true;
74
《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充) if (isequal_m(vb / va)) return true;
75
《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充) }
76
《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充) }
77
《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充) }
78
《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充) return false;
79
《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充) }
80
《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充) 81
《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充) bool calc(size_t step)
82
《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充)
《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充) {
83
《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充) ++count_func;
84
《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充)
《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充) if (step == 2) {
85
《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充) ++count_expr;
86
《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充) return merge_set2(num[0], num[1]);
87
《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充) }
88
《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充) // if (step == 1) {
89
《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充) // ++count_expr;
90
《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充) // size_t j = (1 << N) - 1;
91
《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充) // for (MSETI q = result[j].begin(),qe = result[j].end(); q != qe; ++q)
92
《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充) // if (isequal_m(*q)) return true;
93
《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充) // return false;
94
《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充) // }
95
《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充) 96
《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充) --step;
97
《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充)
《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充) for (size_t i = 0; i < step; i++){
98
《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充)
《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充) for(size_t j = i + 1; j <= step; j++) {
99
《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充) size_t na = num[i];
100
《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充) size_t nb = num[j];
101
《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充) num[i] = na + nb;
102
《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充) num[j] = num[step];
103
《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充) merge_set(na, nb);
104
《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充) if (calc(step)) return true;
105
《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充) num[i] = na;
106
《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充) num[j] = nb;
107
《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充) }
108
《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充) }
109
《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充) return false;
110
《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充) }
111
《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充) 112
《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充) void calc_range( int first, int last, string filename = " nul " )
113
《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充)
《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充) {
114
《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充) if (N ==0 || first >= last || filename.empty()) return;
115
《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充) clock_t ta = clock();
116
《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充) vector<int> vv(N, first);
117
《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充) int *end = &vv[N-1], *p = end, *arr = &vv[0];
118
《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充) ofstream ofs(filename.c_str());
119
《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充) size_t count = 0;
120
《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充) size_t count_b = 0;
121
《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充)
《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充) while(true){
122
《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充) ++count_b;
123
《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充)
《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充) if (calc_num(arr)) {
124
《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充) ofs.width(4);
125
《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充) ofs<< ++count << " ";
126
《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充)
《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充) for (size_t i = 0; i < N; ++i) {
127
《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充) ofs.width(2);
128
《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充) ofs << arr[i]<< " ";
129
《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充) }
130
《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充) ofs << "\n";
131
《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充) }
132
《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充) while (p >= arr && *p >= last) --p;
133
《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充) if (p < arr) break;
134
《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充) int tmp = ++*p;
135
《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充) while (p < end) *++p = tmp;
136
《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充) }
137
《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充) ofs.close();
138
《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充) const char sep[] = "/";
139
《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充) cout << "total: " << count << sep << count_b << "\n"
140
《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充) << count_expr << "/" << count_func << "\n"
141
《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充) << "time: " << clock() - ta << "\n\n";
142
《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充) 143
《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充) }
144
《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充) 145
《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充) int main()
146
《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充)
《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充) {
147
《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充) calc_range(1,13,"nul");
148
《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充) cin.get();
149
《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充) }
150
《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充) 151
《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充) 152
《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充) 153
《程式設計之美》讀書筆記22: 1.16 24點遊戲(補充) 轉載于:https://www.cnblogs.com/flyinghearts/archive/2011/03/22/1991978.html