演算法題-回形取數
阿新 • • 發佈:2022-11-29
演算法題-回形取數
描述
回形取數就是沿矩陣的邊取數,若當前方向上無數可取或已經取過,則左轉90度。一開始位於矩陣左上角,方向向下。
輸入
輸入描述:
輸入第一行是兩個不超過200的正整數m, n,表示矩陣的行和列。接下來m行每行n個整數,表示這個矩陣。
輸入樣例:
3 3
1 2 3
4 5 6
7 8 9
輸出
輸出描述:
輸出只有一行,共mn個數,為輸入矩陣回形取數得到的結果。數之間用一個空格分隔,行末不要有多餘的空格。
輸出樣例:
1 4 7 8 9 6 3 2 5
思路
1.找出規律,是這型別題的重點
2.如何判斷已經全部迴圈完結束了,可以用一個變數記錄count<m*n(輸出一個數,count++,count代表已經遍歷過的個數;m,n分別代表矩陣的行和列)
-
複習一個小知識點
三目運算子:
對於條件表示式b ? x : y,先計算條件b,然後進行判斷。如果b的值為true,計算x的值,運算結果為x的值;否則,計算y的值,運算結果為y的值。一個條件表示式絕不會既計算x,又計算y。條件運算子是右結合的,也就是說,從右向左分組計算。例如,a ? b : c ? d : e將按a ? b : (c ? d : e)執行。
? : ; "?"運算子的含義是:先求表示式1的值,如果為真,則執行表示式2,並返回表示式2的結果;如果表示式1的值為假,則執行表示式3,並返回表示式3的結果。
注意:在C語言中,結果1 和 結果2的型別必須一致。
可以用來控制行末不要有空格。
int a[] ={1,2,3,4};
for(int i=0;i<4;i++){
printf(i ? " %d" : "%d",a[i]);
}
輸出:1 2 3 4
該演算法題程式碼如下:
#include<iostream> #include<stdio.h> using namespace std; int main() { int m,n;//m代表矩陣的行,n代表矩陣的列 int a[200][200];//用來儲存矩陣 //讀入 m,n並且讀入矩陣 cin>>m>>n; for(int i=0;i<m;i++) { for(int j=0;j<n;j++) { cin>>a[i][j]; } } int flag=0;//用來控制行末不要有空格 int count=0;//用來計數,遍歷完一個就count++ int circle=0;//表示遍歷完幾圈了 while(count<m*n) //通過判斷count是否小於m*n即矩陣元素個數來終止遍歷 ,下面每一個for迴圈也是需要判斷 { for(int i=circle;i<=m-1-circle&&count<m*n;i++) //第一列 { if(flag==0) { cout<<a[i][circle]; count++; flag++; } else { cout<<" "<<a[i][circle]; count++; } } for(int j=circle+1;j<=n-1-circle&&count<m*n;j++) //最後一行 { cout<<" "<<a[m-1-circle][j]; count++; } for(int k=m-2-circle;k>=circle&&count<m*n;k--) //最後一列 { cout<<" "<<a[k][n-1-circle]; count++; } for(int h=n-2-circle;h>=circle+1&&count<m*n;h--)//第一行 { cout<<" "<<a[circle][h]; count++; } circle++; } return 0; }