作者bigpigbigpig (To littlepig with love)
看板C_and_CPP
標題Re: [問題] 如何實做一個不會重複的"六進位"?
時間Sat Nov 12 09:46:25 2011
※ 引述《wa007123456 (大笨羊)》之銘言:
: 開發平台(Platform): (Ex: VC++, GCC, Linux, ...)
: VC++
: 問題(Question):
: 是這樣的,我想寫一個程式,裡面有1~6的字元
: 最高位數是6位,且陣列上的值不可重複
: 例如: arr[0][1][2][3][4][5] <=正確!
: arr2[0][0][1][2][3][4] <=錯誤!
: 小弟其實想用程式去算出一個題目
: 就是有一個密碼箱,有六個數字要填,其中1,2不能排首兩位
: 3,4不能排中間兩位 5,6不能排後面兩位
: 我大概知道是6!=720 是全部的可能(未含條件)
: 而含條件後的答案是80 (經過排列組合的計算)
: 我已經想了一個下午了....
: 但是還是沒有頭緒 小弟我是個初學者@@
: 有請先輩們賜教>< 感謝
: ps:這是我突發奇想的問題...
: 另外有沒有大大可以推薦有關"資料結構"的書籍呢?
可以找一下 C++/STL 中的 next_permutation() 演算法,非常好用 :)
貼一下我寫的程式:
// code-6.cpp
//
// 2011/11/12 by Timothy
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
bool valid(vector<int>* V);
int main() {
int i;
int cnt;
bool OK;
vector<int> V;
for ( i = 0; i < 6; i++ ) V.push_back(i+1);
cnt = 0;
do {
OK = valid(&V);
if ( OK ) {
for ( i = 0; i < V.size(); i++ ) cout << V[i];
cout << endl;
cnt++;
}
} while ( next_permutation(V.begin(),V.end()) );
cout << "There are " << cnt << " possible answers." << endl;
system("pause");
return ( 0 );
}
bool valid(vector<int>* V) {
bool b1,b2,b3,b4,b5,b6;
bool fail,res;
b1 = ( (*V)[0] == 1 || (*V)[1] == 1 );
b2 = ( (*V)[0] == 2 || (*V)[1] == 2 );
b3 = ( (*V)[2] == 3 || (*V)[3] == 3 );
b4 = ( (*V)[2] == 4 || (*V)[3] == 4 );
b5 = ( (*V)[4] == 5 || (*V)[5] == 5 );
b6 = ( (*V)[4] == 6 || (*V)[5] == 6 );
fail = b1 || b2 || b3 || b4 || b5 || b6;
res = ! fail;
return ( res );
}
執行結果:
345612
345621
346512
346521
351624
351642
352614
352641
356124
356142
356214
356241
361524
361542
362514
362541
365124
365142
365214
365241
435612
435621
436512
436521
451623
451632
452613
452631
456123
456132
456213
456231
461523
461532
462513
462531
465123
465132
465213
465231
531624
531642
532614
532641
536124
536142
536214
536241
541623
541632
542613
542631
546123
546132
546213
546231
561234
561243
562134
562143
631524
631542
632514
632541
635124
635142
635214
635241
641523
641532
642513
642531
645123
645132
645213
645231
651234
651243
652134
652143
There are 80 possible answers.
請按任意鍵繼續 . . .
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 114.25.189.226
推 wa007123456:推一下! 順便奉上1000P 11/12 10:23
→ wa007123456:不過有兩個標頭檔我尚未看過@@ 11/12 10:24
→ wa007123456:#include <algorithm> 演算法@@? 11/12 10:26
→ wa007123456:這個裡面包含了甚麼有趣的東西呢? 11/12 10:26
→ wa007123456:#include <vector> vector好像是維度@@ 又是做甚麼的 11/12 10:27
→ wa007123456:還有我看到<>符號了@@ C++也支援泛型嗎? 11/12 10:28
推 wa007123456:感謝J大... 11/12 10:49
→ james732:去買本C++ Primer吧 XD 11/12 10:51
→ wa007123456:其實我英文不好XD.. 11/12 10:53
→ james732:C++ Primer有中譯版,翻得還不錯 11/12 10:54
→ wa007123456:我想我要去好好了解一番@@ 11/12 10:54
→ wa007123456:真的嗎@@ 我去書店網站看看 11/12 10:54
推 loveme00835:花一個月STL就可以完全學起來(算小的), 我英文也不好 11/12 16:08
→ james732:完全學起來? 不過STL確實不像boost那麼浩大... 11/12 16:09
→ angleevil:一個月...我很多stl的工具還沒用過. 11/12 20:45