藍橋杯-基礎練習 回形取數

回形取數

資源限制
時間限制:1.0s 內存限制:512.0MB
問題描述
  回形取數就是沿矩陣的邊取數,若當前方向上無數可取或已經取過,則左轉90度。一開始位於矩陣左上角,方向向下。
輸入格式
  輸入第一行是兩個不超過200的正整數m, n,表示矩陣的行和列。接下來m行每行n個整數,表示這個矩陣。
輸出格式
  輸出只有一行,共mn個數,爲輸入矩陣回形取數得到的結果。數之間用一個空格分隔,行末不要有多餘的空格。
樣例輸入

3 3
1 2 3
4 5 6
7 8 9

樣例輸出

1 4 7 8 9 6 3 2 5

樣例輸入

3 2
1 2
3 4
5 6

樣例輸出

1 3 5 6 4 2

思路:
通過循環的判斷來輸出元素。先向下->向右->向上->向左。詳細思路見代碼和註釋中的描述。
注意:題目說末行不能打印多餘空格,但是我沒有判斷直接打印了,還是對了。還有一點。數組a要初始化爲負數,雖然題目上說a中的元素爲正整數,理論上初始化爲0也是可以的,但是這樣只能得到部分分數,初始化爲負數就得到全部分數了。

完整代碼:

#include<iostream>
using namespace std;
int a[205][205];
int main()
{
    int n,m;
    cin>>n>>m;
    for(int i=0;i<n;i++)
    {
        for(int j=0;j<m;j++)
        {
            cin>>a[i][j];
        }
    }
    int ans=0;                      //移動的次數(一共移動n*m次)
    int x=0,y=0;                    //座標
    while(ans<n*m)
    {
        while(x<n&&a[x][y]!=-1)     //向下走
        {
            cout<<a[x][y]<<" ";
            a[x][y]=-1;
            ans++;
            x++;
        }
        x--;                        //出來循環是第n行可是沒有第n行所以x--
        y++;                        //座標向右移動一個
        while(y<m&&a[x][y]!=-1)     //向右走
        {
            cout<<a[x][y]<<" ";
            a[x][y]=-1;
            ans++;
            y++;
        }
        y--;
        x--;
        while(x>=0&&a[x][y]!=-1)    //向上走
        {
            cout<<a[x][y]<<" ";
            a[x][y]=-1;
            ans++;
            x--;
        }
        x++;
        y--;
        while(y>=0&&a[x][y]!=-1)    //向左走
        {
            cout<<a[x][y]<<" ";
            a[x][y]=-1;
            ans++;
            y--;
        }
        y++;
        x++;
    }
    return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章