藍橋 BASIC-25 回型取數

回型取數

問題描述
  回形取數就是沿矩陣的邊取數,若當前方向上無數可取或已經取過,則左轉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

我一開始的思路是每取完矩陣中的元素,用一個符號代替數字,當指針檢測到字符時,便終止循環。但在編碼過程中發現實現有些困難。隨後我觀察矩陣特性,發現每行(列)輸出的字符數都比上次少一個字符。利用這個特點編碼就較爲容易了。

在這裏插入圖片描述

對於上圖的矩陣,根據題意,首先輸出1,6,11三個數。其數量剛好等於矩陣行數;而後輸出12,13,14,15四個數。其數量等於矩陣列數-1.而後是10,5兩個數。數量等於行數-1。以此類推。可將矩陣的輸出分爲幾個階段,分別輸出3,4,2,3,1,2個字符。當輸出完最後一行8,9兩個數之後,矩陣應該向上選取數字輸出,而此時待輸出行數已經等於0(即輸出完每一行後經過-1操作的行數),所以跳出循環,輸出結束。

#include<iostream>
using namespace std;
int main()
{
	int m,n,row,column;//行數,列數,當前行(列)應輸出字符個數 
	int i,j;
	cin >> m >> n;
	int a[m][n] = {0};
	for(i=0;i<m;i++)
		for(j=0;j<n;j++)
			cin >> a[i][j];
	i = j = 0; 
	row = m;
	if(row >= 0)
	{
		for(int k = 0;k < row;k++)//向下 
		{
			cout << a[i][j] << " ";
			i++;
		}
		row--;
		i--;
	}
	column = n - 1;
	while(row >= 0 && column >= 0)
	{
		for(int k = 0;k < column;k++)//向右 
		{
			j++;
			cout << a[i][j] << " ";
		}
		column--;
		if(row < 0 || column < 0)
			break;
		for(int k = 0;k < row;k++)//向上 
		{
			i--;
			cout << a[i][j] << " ";
		}
		row--;
		if(row < 0 || column < 0)
			break;
		for(int k = 0;k < column;k++)//向左 
		{
			j--;
			cout << a[i][j] << " ";	
		}
		column--;
		if(row < 0 || column < 0)
			break;
		for(int k = 0;k < row;k++)//向下 
		{
			i++;
			cout << a[i][j] << " ";	
		}
		row--;
		if(row < 0 || column < 0)
			break;
	}
	return 0;
}

本題暴露出我考慮不周到的問題,一開始只考慮到行列數相等的矩陣。這樣編出的代碼就會比較特殊,而不能包括更加一般的情況。

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