PAT 1050 螺旋矩陣 找規律題 C++

1.N 找出m-n的最大m,n

開平方後的數往上或下找能被整除的

 

2.找規律(循環)

本質:把一個遞減的數組重新排序,沒有時間複雜度的要求可以放到一個新的數組中

順時針完成一次循環(見下圖 黑框和灰框各爲一次循環),

其中一行(i相同),一列(j相同)

一次循環可分爲四個小的步驟(見圖中四個箭頭)。

如果圖不是很好理解,可以以綠色箭頭圈中的數字爲一組。寫出他們的i j(行列號),觀察i j的變化

發現 i j 一個固定一個變化,變化的範圍與行數列數 i有關。

外層循環無法輕易改變當前值,考慮改變當前循環的初值

 

如果以上步驟完成之後,還不是很明白,或者我的表述有錯誤,請留言給我。或者百度 liuchuo 找尋這道題的代碼 看一下。

一下是C++代碼

#include <iostream>
#include <algorithm>
#include <vector>
#include<cmath>
using namespace std;
int cmp(int a,int b){
	return a>b;
}
int main(){
	int N,n,m,t=0;
	cin>>N;
	for(n=sqrt((double)N);n>=1;n--){
		if(N%n==0){
			m=N/n;
			break;
		}
	}
	vector<int> a(N);
	for(int i=0;i<N;i++)
		scanf("%d",&a[i]);
	sort(a.begin(),a.end(),cmp);
        int b[m][n];//其實我沒搞懂爲啥柳神要用vector >.<
	//vector<vector<int> >b(m,vector<int>(n));
	int level = m/2+m%2;
	for(int i=0;i<level;i++){
		//→ 
		for(int j=i;j<=n-1-i;j++)
			b[i][j]=a[t++];
		//↓ 
		for(int j=i+1;j<=m-1-i&&t<N;j++)
			b[j][n-1-i]=a[t++];
		//← 
		for(int j=n-2-i;j>=i&&t<N;j--)
			b[m-1-i][j]=a[t++];
		//↑ 
		for(int j=m-2-i;j>=i+1&&t<N;j--)
			b[j][i]=a[t++];
	}


	for(int i=0;i<m;i++){
		for(int j=0;j<n;j++){
			printf("%d",b[i][j]);
			if(j!=n-1) printf(" ");
		}
		printf("\n");
	}
	return 0;
}

C++代碼

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