回形取數 (注意自己定義的變數是從幾開始的)

萬里無雲便是我發表於2017-03-28

問題

/*基礎練習 回形取數 
時間限制: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 <stdio.h>
#include <string.h>

#define MAX_N 200
int m,n;
int a[MAX_N][MAX_N],b[MAX_N][MAX_N];
int s=0;
void solve(int i,int j)
{
	if(i<m && i>=0 && j<n && j>=0 && b[i][j] == 0)
	{
		printf("%d ",a[i][j]);
		b[i][j] = 1;
	
	}
	else
	{
		s++;
		return ;
	}
	if(s%4 == 0)
	solve(i+1,j);
	if(s%4 == 1)
	solve(i,j+1);
	if(s%4 == 2)
	solve(i-1,j);
	if(s%4 == 3)
	solve(i,j-1);
	

	return ;
}

int main()
{
	memset(b,0,sizeof(b));
	scanf("%d%d",&m,&n);
	int i,j;
	for(i=0; i<m; i++)
		for(j=0; j<n; j++)
			scanf("%d",&a[i][j]);
	solve(0,0);
	puts("");
	return 0;
}

自我改正

 #include<stdio.h>
#include<string.h>
#define maxm 200
#define maxn 200
int a[maxm][maxn];
int b[maxm][maxn];
int m,n;//生命的是全域性變數
int s=0;
void sort(int i,int j)
 {

    	if(i>=1&&i<=m&&j>=1&&j<=n&&b[i][j]==0)
			 	{
				 	printf("%d ",a[i][j]);
			 		b[i][j]=1;
			 	
				 }			
			else
			{
			s++;
			return ;
			}	
			if(s%4==0)
			sort(i+1,j);//已經是遞迴了,不需要有迴圈 
			if(s%4==1)
			sort(i,j+1);
			if(s%4==2)
			sort(i-1,j);
			if(s%4==3)
			sort(i,j-1);
            return ;
 }
int main()
{
    int i,j;
	memset(b,0,sizeof(b));
	scanf("%d%d",&m,&n);
	for(i=1;i<=m;i++)
	{
		for(j=1;j<=n;j++)
		{
			scanf("%d",&a[i][j]);
		}
	}
	sort(1,1);//注意這是從1開始的
	puts("");
	return 0;
}




相關文章