藍橋杯 回形取數

資源限制:時間限制: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

#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.

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章