看板 C_and_CPP 關於我們 聯絡資訊
不曉得原po是要求所有可能,還是要求幾種可能。 窮舉所有可能,這題解法是DFS。 必須注意的是,如果為稀疏矩陣,是不是可以只儲存對應的元素? 程式碼不到40行,我就直接貼了。 #include <iostream> #include <sstream> #include <vector> using namespace std; vector< vector<int> > M; string output("A A A A A A A A A A A A A A A A A A A A A A A A A A"); vector<bool> U(26, false); void dfs(int y, int d) { if(y == (int)M.size()) { cout << output.substr(0, d * 2) << "\n"; } else { for(size_t i = 0; i < M[y].size(); ++i) { if(!U[M[y][i]]) { U[M[y][i]] = true; output[d * 2] += M[y][i]; dfs(y + 1, d + 1); output[d * 2] = 'A'; U[M[y][i]] = false; } } } } int main() { string s; while(getline(cin, s, '\n')) { istringstream stream(s); vector<int> vec; int num; for(int i = 0; stream >> num; ++i) { if(num > 0) { vec.push_back(i); } } M.push_back(vec); } if(M.size() > 0) { dfs(0, 0); } return 0; } 至於後者,我想很多高手推文或回文已經給你方向了。 ※ 引述《QWWJDQ (夢想十足總是失足)》之銘言: : 給一個 3*4 矩陣 M, 如下: : A B C D E : a 1 1 0 1 0 : M = b 0 0 1 0 0 : c 0 1 0 0 1 : 其中每一列中,1代表可以對應,0代表不可對應。 : 例如:第一列 a 可以對應於 A, B, D,不可對應於C, E。 : 欲求 a,b,c 一一對應(one-to-one)於 A,B,C,D,E 的所有可能。 : 也就是有如下結果: : a b c, a b c, a b c, a b c, a b c : | | | | | | | | | | | | | | | : A C B, A C E, B C E, D C B, D C E : 共五種。 : 想請問,這種問題適合用遞迴嗎,特別是當矩陣大小達到20*33時? : 有沒有類似問題的演算法? : 如果要用遞迴的話,我的想法是: : 矩陣M中的第一列,有"三個"非零元素, : A B C D E : a 1 1 0 1 0 : M = b 0 0 1 0 0 : c 0 1 0 0 1 : for i = 1 to "3" : if !(M包含某列元素皆為0) : { : 1.取第i個非零元素, i=1 時為 M(a,A), 紀錄此mapping (a,A) : 2.將第a列,第A行刪除,得: : B C D E : M = b 0 1 0 0 : c 1 0 0 1 : 3. 再用此M去遞迴 : 其中,當M為空時, 列出mapping結果. : } : 不知道這樣的想法OK不OK, : 因為其中有個for loop,所以不知道該怎麼把mapping的過程記錄下來。 : 這個演算法我之後希望能套用到一個較大SIZE的矩陣(20*33),複雜度很高, : 我有嘗試過用queue和stack的方式做,在小矩陣上OK, : 換了大矩陣後,跑了一天還沒跑完, : 不知道有沒有高手可以提供一點意見,感激不盡。 : *第一次PO文,不知道這問題適不適合在這個版上,還請見諒。 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 114.43.114.186
bleed1979:抱歉,我忽略了重複的部分,再寫過。 05/29 00:41
※ 編輯: bleed1979 來自: 114.43.114.186 (05/29 00:51)
bleed1979:原文已修改。 05/29 00:51
※ 編輯: bleed1979 來自: 114.43.114.186 (05/29 00:54)
firejox:我擔心string放裏面會有記憶體吃不消的問題... 05/29 00:55
※ 編輯: bleed1979 來自: 114.43.114.186 (05/29 01:14)
bleed1979:感謝指點,還是力求精進比較好。 05/29 01:15
loveme00835:http://goo.gl/6rvUZ http://goo.gl/Bn83I 05/29 02:00
loveme00835:因為有就用 vs 懂了才用, 是兩碼子事 05/29 02:00
loveme00835:如果要拚速度可以用 http://goo.gl/vLA96 05/29 02:04