順時針輸出矩陣
阿新 • • 發佈:2018-12-16
- 輸入一個矩陣,按照從外向裡以順時針的順序依次打印出每一個數字,例如,如果輸入如下4 X 4矩陣: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 則依次打印出數字1,2,3,4,8,12,1
- 本菜鳥的演算法
class Solution { public:bool result(int n,int m) { return n == m ? true : false; } public:vector<int> printMatrix(vector<vector<int> > matrix) { int n = matrix.size(); int m = matrix[0].size(); int x,y,x_1,y_1,x_2; int count = 0 ,i=0; bool isok = false; vector<int> vector; for(x=0;x<(n-i);x++,i++) //橫 { for(y=x;y<(m-i);y++) { cout<<matrix[x][y]<<endl; vector.push_back(matrix[x][y]); count++; if(result(count,n*m)) { isok = true;break;} } if(isok == true) return vector; for(x_1=(x+1),y--;x_1<(n-i);x_1++) //豎 { cout<<matrix[x_1][y]<<endl; vector.push_back(matrix[x_1][y]); count++; if( result(count,n*m)) {isok = true;break;} } if(isok==true) return vector; for(y_1=(y-1),x_1--;y_1>=i;y_1--) //反橫 { cout<<matrix[x_1][y_1]<<endl; vector.push_back(matrix[x_1][y_1]); count++; if(result(count,n*m)) {isok = true;break;} } if(isok == true) return vector; for(x_2=(x_1-1),y_1++;x_2>i;x_2--) //反豎 { cout<<matrix[x_2][y_1]<<endl; vector.push_back(matrix[x_2][y_1]); count++; if(result(count,n*m)) {isok = true;break;} } if(isok == true) return vector; } return vector; } };
- 上面的演算法菜在判斷何時結束迴圈體,下面有請大佬的演算法。
/* 思想,用左上和右下的座標定位出一次要旋轉列印的資料,一次旋轉列印結束後,往對角分別前進和後退一個單位。 提交程式碼時,主要的問題出在沒有控制好後兩個for迴圈,需要加入條件判斷,防止出現單行或者單列的情況。 */ class Solution { public: vector<int> printMatrix(vector<vector<int> > matrix) { int row = matrix.size(); int col = matrix[0].size(); vector<int> res; // 輸入的二維陣列非法,返回空的陣列 if (row == 0 || col == 0) return res; // 定義四個關鍵變數,表示左上和右下的列印範圍 int left = 0, top = 0, right = col - 1, bottom = row - 1; while (left <= right && top <= bottom) { // left to right for (int i = left; i <= right; ++i) res.push_back(matrix[top][i]); // top to bottom for (int i = top + 1; i <= bottom; ++i) res.push_back(matrix[i][right]); // right to left if (top != bottom) for (int i = right - 1; i >= left; --i) res.push_back(matrix[bottom][i]); // bottom to top if (left != right) for (int i = bottom - 1; i > top; --i) res.push_back(matrix[i][left]); left++,top++,right--,bottom--; } return res; } };
- 我的演算法和大佬的演算法本質沒有區別,我使用x右上角的座標為基點進行迴圈,大佬使用四個對角座標為基點進行迴圈,不同的方法導致了程式碼差異這麼大,傷心。還需要繼續努力啊。