1. 程式人生 > 其它 >試題 基礎練習 回形取數

試題 基礎練習 回形取數

技術標籤:藍橋杯c++

資源限制
時間限制: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>
#include<string>
using namespace std;
int  a[200][200];
int i = 0, j = 0;
int i_1 = 0, j_1 = 0;
void getdate(int m, int n)//m*n的矩陣
{
	for (int x = 0; x<m; x++)
		for (int y = 0; y < n; y++)
		{
			cin >> a[x][y];
		}
}
void show(int m, int n)//結果輸出
{
	
	int b[200]
[200]; int sum = 0; for (int x = 0; x < m; x++) //對陣列b的初始化。0代表對應位置上的數已被讀取,1反之。 for (int y = 0; y < n; y++)//也可以用memset()來進行初始化,在string的標頭檔案中。 b[x][y] = 1; while (sum < m*n) { for (i; i < m - i_1; i++)//向下走 { if (b[i][j] == 1 && b[i][j] > 0) { cout <<
a[i][j] << " "; b[i][j] = 0; sum++; } } for (j; j < n - j_1; j++)//向右走 { if (b[i - 1][j] == 1 && b[i - 1][j] > 0) { cout << a[i - 1][j] << " "; b[i - 1][j] = 0; sum++; } } for (i = m - 2 - i_1; i >= 0+i_1; i--)//向上走 { if (b[i][j - 1] == 1 && b[i][j - 1] > 0) { cout << a[i][j - 1] << " "; b[i][j - 1] = 0; sum++; } } for (j = n - 2 - j_1; j > 0; j--)//向左走 { if (b[i + 1][j] == 1 && b[i + 1][j] > 0) { cout << a[i + 1][j] << " "; b[i + 1][j] = 0; sum++; } } i_1++; j_1++; i = i_1; j = j_1; } cout << endl; } int main() { int m, n; cout << "請輸入兩個正整數,分別為行數,列數:" << endl; cin >> m >> n; getdate(m, n); show(m, n); }

評測資料:(可自行復制驗證)

  • 7 5
    2995 1945 4827 5436 2400
    4607 3902 153 292 2385
    7424 8719 9721 9898 5447
    1732 4774 1541 1869 9915
    5673 6305 7038 9894 8709
    3817 1331 342 7676 4664
    5144 7711 8259 6868 5553

    2995 4607 7424 1732 5673 3817 5144 7711 8259 6868 5553 4664 8709 9915 5447 2385 2400 5436 4827 1945 3902 8719 4774 6305 1331 342 7676 9894 1869 9898 292 153 9721 1541 7038


評測結果:

在這裡插入圖片描述


還請各位多多指教,謝啦。