1050螺旋行列——c実現

2011 ワード

1050らせん行列(25分)
本題では,与えられたN個の正の整数を非増分順に「螺旋行列」に埋め込むことを要求する.「ヘリカルマトリクス」とは、左上隅の1番目の格子から、時計回りにヘリカル方向に塗りつぶすことです.要求マトリクスの規模はm行n列であり、条件を満たす:m×nはNに等しい.m≥n;そして、m−nは、全ての可能な値のうちの最小値をとる.
入力形式:
入力は、1行目に正の整数Nを与え、2行目にN個の充填される正の整数を与える.すべての数字は10 4を超えず、隣接する数字はスペースで区切られています.
出力フォーマット:
スパイラル行列を出力します.各行n個の数字、共m行.隣接する数字は1つのスペースで区切られており、行末に余分なスペースがないようにしてください.
サンプルを入力:
12
37 76 20 98 76 42 53 95 60 81 58 93

出力サンプル:
98 95 93
42 37 81
53 20 76
58 60 76

考え方:
この問題の難点は全部で2点あり、第1点はm*nを確定することである.2つ目は、スパイラルマトリクスをどのように印刷できるかです.
最初の問題は比較的簡単で,n=(int)sqrt(n)を譲るだけで,N%n=0となり,満たさなければn−,適切なm,nが見つかる.
第2の問題は少し面倒で、肝心なのは類似の問題を処理する経験があることで、まず閉じた1周を1つの研究対象とし、1周は上下左右の4つの矩形の辺の出力を含んで、ここで2つのfor循環が必要であることを見ることができます.各行の特徴に注意して、1つの輪の中の最も上りで、データを保存する時、行数は変わらず列数が増加します;右端には、列数が一定で行数が減少・・・順次2次元配列に格納されます.
注意点:また、螺旋がどれだけ回転するかをどのように決定するかという問題に注意しなければならない.4*3の行列と4*4の行列を描いて分析を助けた.彼らは2周目の値が途中に回転したが.すなわち、実は1回転ごとに2列を使う必要があり、偶数列であればn/2で回転数を求めることができるが、奇数列であればn/2が1列残っているので、n/2+n%2であるべきで、偶数のときに余剰を取っても役に立たず、奇数のときに1回転を多く加えることができる.
コード:
//1050      v1
#include 
#include 
#include 

int cmp(const void* a,const void* b){
	return *(int*)b-*(int*)a;	//b-a   ,a-b    
}

int main(){
	int N,n,m,i,j;	scanf("%d",&N);
	int a[N];
	for(n=0;n=0;k--){	//          
		for(j=lcol;j<=rcol&&i!=N;j++,i++)	//      	
			mat[urow][j]=a[i];
		urow++;	//        
		for(j=urow;j<=drow&&i!=N;j++,i++)	//      
			mat[j][rcol]=a[i];
		rcol--;
		for(j=rcol;j>=lcol&&i!=N;j--,i++) 
			mat[drow][j]=a[i];
		drow--;
		for(j=drow;j>=urow&&i!=N;j--,i++)
			mat[j][lcol]=a[i];
		lcol++;
	}
	for(i=0;i

参照先:
PAT乙級1050.らせん行列(C言語)
(PAT B級)1050螺旋行列(C言語実装)