問題描述
回形取數就是沿矩陣的邊取數,若當前方向上無數可取或已經取過,則左轉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
#include <iostream>
using namespace std;
int a[201][201],vis[201][201];
int main()
{
freopen("3.txt","r",stdin);
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 i=-1,j=-1;
int sum=n*m;
while(sum){
for(i++,j++;i<n&&!vis[i][j];i++){//下
cout<<a[i][j];
vis[i][j]=1;
if(sum!=1)
cout<<' ';//題目中要求不讓輸出多餘的空格
sum--;
}
for(i--,j++;j<m&&!vis[i][j];j++){//右
cout<<a[i][j];
vis[i][j]=1;
if(sum!=1)
cout<<' ';
sum--;
}
for(j--,i--;i>=0&&!vis[i][j];i--){//上
cout<<a[i][j];
vis[i][j]=1;
if(sum!=1)
cout<<' ';
sum--;
}
for(i++,j--;j>=0&&!vis[i][j];j--){//左
cout<<a[i][j];
vis[i][j]=1;
if(sum!=1)
cout<<' ';
sum--;
}
}
return 0;
}
觀察下標規律即可,使用vsi數組標記。使用sum作爲循環判斷條件。四個方向都考慮到,並且注意判斷和邊界條件。根據循環的結果,i,j分別都被初始化爲-1.