63アレイ

63  アレイ

著者:  日引用  時間の制約:  10S 章:  2次元配列

問題の説明:

もちろん学校で、数学の利益団体に参加しています。クラスでは、先生は非常に興味深い配列を導入しました。

アレイは、デジタル配列番号照合が外側中間反時計から開始される増分開始から、それが最大出力Nまで、次の1〜2で発生し、そして、nは正の整数から成ります。

場合、例えば、n = 5、として配列は、以下:  

  5

1 4

2 3

9ときN =、次の配列:

7 6 5

8 1 4

9 2 3

場合N = 10、として配列は、以下:

  7 6 5

  8 1 4

  9 2 3

10

もちろん、私は、住宅建設そのようなアレイそれを自分でやりたいです。彼は、から構成され、N = 1始めたが、彼は、配列の複雑さは、その後、簡単にそれがエラーの配列で構成され、高い、nは増加することを見つけたとき。あなたに回すために明らかに、エラーレートの構造体配列を減らす建設速度を向上させるためには、彼がそのようなアレイを構築するため、プログラムを書く助けてください。

問題が明確に起因することができます:あなたは正の整数を与えるnは、タイトル、構築配列に記載の方法を押してください。

説明を入力します。

あなたは、入力されたデータは、あなたがプログラムを書くような手順は、標準入力デバイスからのテストデータを読み込む必要が書きます。試験データの標準的な入力装置の複数のセット、テストデータの各セットのみ一列、各行つのみ正の整数サイズN(1≤n≤99)、すなわち、アレイが構築されます。また、空白行である各試験群およびそれに続く試験データ、前方の第一の組のテストデータとテストデータの最後のセットの後ろに空白行が存在しません。

出力説明:

テストデータのセットごとに、プログラムは、計算結果の対応する組を計算するために必要であり、このグループ内の演算結果が順次標準出力装置に書き込まれる書き込みプログラムなどのデータを出力する書き込み。サイズnの各グループの計算結果は、数字の配列は、スペースで区切られた、サンプル出力の特定の形態を参照してください、各出力の数を表すビットの数であり、場合Nである場合、N各列の出力が(2未満の左側の空間まで)は、2つを占めるときに二桁、2桁の数字。計算結果のセットとの間の空白行それと各操作後の結果、最後の演算結果の後には空行。注意:一般的に、標準的な表示出力装置。

入力例:

 

5
45
10

 

出力例:

5
1 4
2 3

43 42 41 40 39 38 37
44 21 20 19 18 17 36
45 22 7 6 5 16 35
23 8 1 4 15 34
24 9 2 3 14 33
25 10 11 12 13 32
26 27 28 29 30 31

7 6 5
8 1 4
9 2 3
10

 

問題解決のためのアイデア:(貧しい人々の最近の状態は、常にゲームをプレイしたい。)私は約いくつかの質問を模索この質問の価値を考えます

1、最初の要素1の座標(i、j)はどのように確立しますか?

観察は、(実際には、長いオープンするマトリクスアレイ十分な大きさと同じくらい)ファジールールを要約します。私は、ファジィルールを取りました。

 

 

 

CEIL()関数が切り上げられ、初期座標は、実際の最初の要素を決定する際に偶発的発生を防止するために、私は保険(+1)を加えました。

第1のループカウンタnは、数学的法則を観察するまで2は、アナログ割当て行列を処理する方法を、添加しました。すべては、一般的にパスを取ります

 

 

 しかし、このパスが正確ではない、我々はそれを修正することができます。その後、我々は、割り当てに行列の各要素は、それが常にオンにする傾向があることがわかりました

(反時計回り直角に曲がった)が、必ずしも成功していません。プレス方向ストレート時間が、次回はターンする傾向を続けています。あなたが回し優先順位を変えることができた場合は、それ以外の場合はAに乗り出します

古いです。

 

 

 3、(使用される場合、出力)マトリクスサイズ、境界(壁)だけでなく、実際の境界フェンス割り当てを記録することに留意されたいです。

図4に示すように、ノートの形式で。この質問は、私は長い時間をフォーマットんです。

次のようにトピック要件は次のとおりです。

実際には、私が最も典型的な、多くのミスをしました

 

 何の問題もなく、しかし(スペースは、可視文字の出力に置き換えられます、フォーマットチェック)可視文字を追加した後、次のように一見

 

 

 

最後の3行は、複数の出力スペースに直面し、削除する必要があります!

 

まあ、完全なコード

  1 #include <stdio.h>
  2 #include <stdlib.h>
  3 #include <math.h>
  4 #include <string.h>
  5 #include <ctype.h>
  6 
  7 
  8 #define maxn 15
  9 
 10 int martix[maxn][maxn];
 11 
 12 int hash[maxn];
 13 
 14 int X[] = {1,0,-1,0};
 15 int Y[] = {0,1,0,-1};
 16 int m = 0;
 17 int n;
 18 int mini,minj,maxi,maxj;
 19 void writeMartix(int start);
 20 void InitMartix();
 21 void MyPrint();
 22 int main(){
 23     
 24     InitMartix();//初始化矩阵一次即可
 25     int flag = 0;
 26     while(scanf("%d",&n)!=EOF){
 27         InitMartix();
 28 
 29         if(flag == 1){
 30             printf("\n");
 31         }
 32         flag = 1;
 33         mini = minj = 100;
 34         maxi = maxj = -1;
 35 
 36         if(n == 1){
 37             printf("%d\n",1);
 38         }else if(n==2){
 39             printf("%d\n%d\n",1,2);    
 40         }else{
 41             double num = sqrt(n);    
 42             int start = ceil(num);    
 43             start = start/2+1;//i,j的开始坐标
 44             writeMartix(start);
 45             MyPrint();
 46         }
 47         
 48     }
 49 
 50     return 0;
 51 }
 52 
 53 
 54 void writeMartix(int start){
 55     int i,j,idx;
 56     int num = 1;
 57     //printf("%d ===\n",start);
 58     i = j = start;
 59     idx = 3;
 60     int x,y;
 61 
 62     while(num<=n){
 63         martix[i][j] = num;
 64         if(i<mini){
 65             mini = i;
 66         }
 67         if(j<minj){
 68             minj = j;
 69         }
 70 
 71         if(i>maxi){
 72             maxi = i;
 73         }
 74         if(j>maxj){
 75             maxj = j;
 76         }
 77         num++;
 78         idx = (idx+1)%4;    //提前预定转弯
 79         x = i + X[idx];
 80         y = j + Y[idx];
 81 
 82         if(martix[x][y] == -1){
 83             //OK
 84             i = x;
 85             j = y;
 86         }else{
 87             //转弯失败,回退
 88             idx = (idx-1+4)%4;
 89             x = i + X[idx];
 90             y = j + Y[idx];
 91             i = x;
 92             j = y;
 93         }
 94 
 95         //printf("%d
 96     }
 97 }
 98 
 99 void InitMartix(){
100     int i,j;
101     
102     for(i=0;i<15;i++){
103         for(j=0;j<15;j++){
104             martix[i][j] = -1;    
105         }
106     }
107 }
108 
109 void MyPrint(){
110     int i,j;
111     int count = 0;
112 
113     for(j=minj;j<=maxj;j++){
114         hash[j] = 1;//默认输出一位
115         for(i=mini;i<=maxi;i++){
116             if(martix[i][j]>=10){
117                 hash[j] = 2;
118                 break;
119             }
120         }
121     }
122     for(i=mini;i<=maxi;i++){
123         for(j=minj;j<=maxj;j++){
124             if(martix[i][j]==-1){
125                 if(j==maxj){//去掉每行后面的空格
126                     break;
127                 }
128                 if(hash[j]==1){
129                     printf(" ");    
130                 }else{
131                     printf("  ");
132                 }
133                 if(j!=maxj){
134                     printf(" ");
135                 }
136                 //
137             }else{
138                 if(hash[j]==1){
139                     printf("%d",martix[i][j]);
140                 }else{
141                     printf("%2d",martix[i][j]);
142                 }
143                 count++;
144                 if(count == n){
145                     break;
146                 }
147                 martix[i][j] = -1;//复原矩阵
148                 if(j!=maxj&&count!=n&&martix[i][j+1]!=-1){
149                     printf(" ");
150                 }
151             }
152 
153         }
154         printf("\n");
155         
156     }
157 }

 

おすすめ

転載: www.cnblogs.com/ManOK/p/12621320.html