看板 C_and_CPP 關於我們 聯絡資訊
※ 引述《liu23829 (做人別太跩)》之銘言: : 而且此區塊移動整理後,並無法形在某區塊右下和下方皆為0元素,故停止 : 重點還是“非0元素的移動”,針對鎖定的行,做列的移動,再針對 : 移動後非0元素所在列做行的移動,以此類推,而判別停止的條件有2 : 1.形成某區塊右下和下方皆為0元素,則停止,遮閉該區塊所在的行與列,考慮剩下的區塊 : 2.移動後無法形成右方和下方皆為0元素,也要停止 : 演算式我想不出來,能幫忙的感激不盡~~~~ 矩陣的運算很少,算一算只有加法,乘法,轉置. 還有,可能包含你所說的行互換跟列互換. 我猜你想要的是: 將矩陣做任意次序的行互換或列互換,使矩陣元素盡可能貼齊對角線. 那我想,可以先寫個函數將一列 1xN 或 Mx1 矩陣用二進位換算法算成數值: int ToBinary(double string[], int len) { int result = 0; for (int i=0; i<len; i++) { result *= 2; result += (string[i] == 0)? 0 : 1; } return result; } 然後,對你所指定的矩陣: double matrix[][6] = { {0.5,0,0,0.0,0}, {0,2,0,0,3,2}, {0,0,2,0,1,0}, {0,0.333,0,0,0,0}, {1,0,0,2,0,0} }; for (int i=0; i<5; i++) { for (int j=0; j<6; j++) { cout << matrix[i][j] << '\t'; } cout << endl; } cout << endl; 先對行排序,再對列排序: cout << "Sort columns: " << endl; for (int i = 1; i<6; i++) { for (int j = 0; j<6-i; j++) { double *p = new double[5]; double *q = new double[5]; for (int k=0; k<5; k++) { p[k] = matrix[k][j]; q[k] = matrix[k][j+1]; } if (ToBinary(p, 5) < ToBinary(q, 5)) { for (int k=0; k<5; k++) { matrix[k][j] = q[k]; matrix[k][j+1] = p[k]; } } delete p; delete q; } } for (int i=0; i<5; i++) { for (int j=0; j<6; j++) { cout << matrix[i][j] << '\t'; } cout << endl; } cout << endl; cout << "Sort rows: " << endl; for (int i = 1; i<5; i++) { for (int j = 0; j<5-i; j++) { double *p = new double[6]; double *q = new double[6]; for (int k=0; k<6; k++) { p[k] = matrix[j][k]; q[k] = matrix[j+1][k]; } if (ToBinary(p, 6) < ToBinary(q, 6)) { for (int k=0; k<6; k++) { matrix[j][k] = q[k]; matrix[j+1][k] = p[k]; } } delete p; delete q; } } for (int i=0; i<5; i++) { for (int j=0; j<6; j++) { cout << matrix[i][j] << '\t'; } cout << endl; } cout<< endl; 先對行排序再對列排序,輸出為: ----------------------------------------- 0.5 0 0 0 0 0 0 2 0 0 3 2 0 0 2 0 1 0 0 0.333 0 0 0 0 1 0 0 2 0 0 Sort columns: 0.5 0 0 0 0 0 0 3 2 2 0 0 0 1 0 0 2 0 0 0 0.333 0 0 0 1 0 0 0 0 2 Sort rows: 1 0 0 0 0 2 0.5 0 0 0 0 0 0 3 2 2 0 0 0 1 0 0 2 0 0 0 0.333 0 0 0 請按任意鍵繼續 . . . ----------------------------------------- 看起來不漂亮,有個2跑在右上角. 那就接著再做一次行排序與列排序, 結果是: ----------------------------------------- Sort columns: 1 2 0 0 0 0 0.5 0 0 0 0 0 0 0 3 2 2 0 0 0 1 0 0 2 0 0 0 0.333 0 0 Sort rows: 1 2 0 0 0 0 0.5 0 0 0 0 0 0 0 3 2 2 0 0 0 1 0 0 2 0 0 0 0.333 0 0 請按任意鍵繼續 . . . ----------------------------------------- 做到這裡大概再也排不動了. 對照前面你所導出的結果,我這個結果還要再把一二列互換,三四列互換. 並將第六行插到二三行之間. 在我的方法中,也許我可以改寫 int ToBinary(double string[], int len) 函數, 使它判斷 * - - - - - 大於 * * - - - - 而後者又大於 - * - - - - 就會有適合的排列結果. -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 218.160.111.200