1. 程式人生 > 其它 >演算法題-回形取數

演算法題-回形取數

演算法題-回形取數

描述

回形取數就是沿矩陣的邊取數,若當前方向上無數可取或已經取過,則左轉90度。一開始位於矩陣左上角,方向向下。

輸入

​ 輸入描述:

​ 輸入第一行是兩個不超過200的正整數m, n,表示矩陣的行和列。接下來m行每行n個整數,表示這個矩陣。

​ 輸入樣例:

​ 3 3

​ 1 2 3

​ 4 5 6

​ 7 8 9

輸出

​ 輸出描述:

​ 輸出只有一行,共mn個數,為輸入矩陣回形取數得到的結果。數之間用一個空格分隔,行末不要有多餘的空格。

​ 輸出樣例:

​ 1 4 7 8 9 6 3 2 5

思路

1.找出規律,是這型別題的重點

2.如何判斷已經全部迴圈完結束了,可以用一個變數記錄count<m*n(輸出一個數,count++,count代表已經遍歷過的個數;m,n分別代表矩陣的行和列)

  • 複習一個小知識點

    三目運算子:

    對於條件表示式b ? x : y,先計算條件b,然後進行判斷。如果b的值為true,計算x的值,運算結果為x的值;否則,計算y的值,運算結果為y的值。一個條件表示式絕不會既計算x,又計算y。條件運算子是右結合的,也就是說,從右向左分組計算。例如,a ? b : c ? d : e將按a ? b : (c ? d : e)執行。

    ? : ; "?"運算子的含義是:先求表示式1的值,如果為真,則執行表示式2,並返回表示式2的結果;如果表示式1的值為假,則執行表示式3,並返回表示式3的結果。

    注意:在C語言中,結果1 和 結果2的型別必須一致。

    可以用來控制行末不要有空格。

	int a[] ={1,2,3,4};
	for(int i=0;i<4;i++){
		printf(i ? " %d" : "%d",a[i]);
	}
    輸出:1 2 3 4

該演算法題程式碼如下:

#include<iostream>
#include<stdio.h>
using namespace std;
int main()
{
	int m,n;//m代表矩陣的行,n代表矩陣的列
	int a[200][200];//用來儲存矩陣 
	//讀入 m,n並且讀入矩陣 
	cin>>m>>n;    
	for(int i=0;i<m;i++)
	{
		for(int j=0;j<n;j++)
		{
			cin>>a[i][j];
		}
	}
	int flag=0;//用來控制行末不要有空格 
	int count=0;//用來計數,遍歷完一個就count++
	int circle=0;//表示遍歷完幾圈了 
	while(count<m*n) //通過判斷count是否小於m*n即矩陣元素個數來終止遍歷 ,下面每一個for迴圈也是需要判斷 
	{
		for(int i=circle;i<=m-1-circle&&count<m*n;i++)  //第一列 
		{
			if(flag==0)
			{
				cout<<a[i][circle];
				count++;
				flag++;
			}
			else
			{
				cout<<" "<<a[i][circle];
				count++;	
			}

		}
		for(int j=circle+1;j<=n-1-circle&&count<m*n;j++) //最後一行 
		{
			cout<<" "<<a[m-1-circle][j];
			count++;
		}
		for(int k=m-2-circle;k>=circle&&count<m*n;k--) //最後一列 
		{
			cout<<" "<<a[k][n-1-circle];
			count++;
		}
		for(int h=n-2-circle;h>=circle+1&&count<m*n;h--)//第一行 
		{
			cout<<" "<<a[circle][h];
			count++;
		}
		circle++;	
	}
	return 0;
}