1. 程式人生 > >藍橋杯練習系統 基礎練習 回形取數(C++)

藍橋杯練習系統 基礎練習 回形取數(C++)

問題描述

  回形取數就是沿矩陣的邊取數,若當前方向上無數可取或已經取過,則左轉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 main()
{
	int m,n,i,j,t=0;
	cin>>m>>n;
	int **ferry;
	//給二維陣列開空間 
	ferry=new int*[m];
	for(i=0;i<m;i++)
	{
		ferry[i]=new int[n];
	}
	//輸入二維陣列 
	for(i=0;i<m;i++)
	{
		for(j=0;j<n;j++)
		{
			cin>>ferry[i][j];
		}
	}
	//回形演算法 
	i=0;
	j=0;
	cout<<ferry[i][j];
	ferry[i][j]=-1;
	while(t<m*n)
	{
		while(i+1<m&&ferry[i+1][j]!=-1)//↓ 
		{
	    	cout<<" "<<ferry[++i][j];
	    	ferry[i][j]=-1;
			t++;				 
    	}
	
    	while(j+1<n&&ferry[i][j+1]!=-1)//→ 
	    {
	    	cout<<" "<<ferry[i][++j];
			ferry[i][j]=-1;
			t++;
    	}
    	while(i-1>=0&&ferry[i-1][j]!=-1)//↑ 
    	{
	
	    	cout<<" "<<ferry[--i][j];
			ferry[i][j]=-1;
			t++;
	    }
    	while(j-1>=0&&ferry[i][j-1]!=-1)//← 
    	{
	     	cout<<" "<<ferry[i][--j];
			ferry[i][j]=-1;
			t++;
    	}
    	if(t==m*n-1)break;
   }
	
	system("pause");
	return 0;
}