63 matriz

63  matriz

Autor:  Sun citando  las limitaciones de tiempo:  10S capítulos:  matriz bidimensional

Descripción del problema:

Obviamente, en la escuela, participar en grupos de interés matemáticas. En la clase, el profesor introdujo una serie muy interesante.

La matriz consta de n entero positivo, de una matriz digital de comienza a incrementar el número de colación se inicia desde un sentido antihorario intermedia hacia el exterior, se produce en el siguiente 1 2, y luego hacia arriba hasta que la salida n.

Cuando, por ejemplo, cuando n = 5, la matriz como sigue:  

  5

1 4

2 3

9 cuando n =, la siguiente matriz:

7 6 5

8 1 4

9 2 3

Cuando n = 10, la matriz como sigue:

  7 6 5

  8 1 4

  9 2 3

10

Obviamente quiero hacerlo usted mismo de construcción de viviendas dichas matrices. Comenzó a configurarse a partir de n = 1, pero cuando descubrió que el aumento de n, mayor es la complejidad de la matriz, a continuación, más fácil se construye de una serie de errores. Con el fin de reducir la estructura de matriz de tasa de errores, mejorar la velocidad de la construcción, obviamente, a su vez a que, por favor, ayudar a escribir un programa para construir una matriz de modo.

El problema puede atribuirse claramente a: darle un número entero positivo n, por favor presione el método descrito en el título, la matriz construida.

Introduzca una descripción:

Usted escribe procedimientos requieren la lectura de los datos de prueba desde el dispositivo de entrada estándar como datos de entrada se escribe el programa. Estándar de dispositivos de entrada múltiples conjuntos de datos de prueba, cada conjunto de datos de prueba sólo una fila, cada fila sólo un tamaño entero positivo n (1≤n≤99), es decir, la matriz para ser construidos. No hay una línea en blanco entre cada grupo de prueba y los datos de prueba posterior, los datos de las pruebas de la primera serie de delante y detrás del último conjunto de datos de prueba son también las líneas en blanco no.

Descripción Salida:

Para cada conjunto de datos de prueba, se escribe programa requiere para calcular un conjunto de resultado del cálculo correspondiente, y da salida a los datos que el programa se escribe resultados de la operación de este grupo se escriben secuencialmente al dispositivo de salida estándar. Un resultado de cálculo de cada grupo de tamaño n, matriz de números separados por un espacio, por favor referirse a la forma específica de la salida de la muestra: cuando n es un número de bits, representando cada una un número de la salida, cuando n es cuando el doble dígitos, el número de dos dígitos, donde representa cada salida en la columna para dos (espacio en la izquierda de menos de 2). Los resultados después de cada operación con el mismo una línea en blanco entre un conjunto de resultado de cálculo, hay una línea en blanco después de la última resultado del cálculo. Nota: En general, el dispositivo de salida de visualización estándar.

Ejemplo de entrada:

 

5
45
10

 

Resultado de muestra:

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

 

Ideas para resolver problemas :( estado reciente de los pobres, siempre quieren jugar el juego.) Creo que esta pregunta vale la pena explorar algunas preguntas acerca

1, las coordenadas del primer elemento 1 (i, j) ¿Cómo establecer?

Observación, resuma la regla difusa (de hecho, siempre que la disposición de matriz suficientemente grande para abrir). Tomé una regla difusa.

 

 

 

ceil (); función se redondea hacia arriba, a fin de evitar accidental generan cuando las coordenadas iniciales para determinar el primer elemento real, añadí el seguro (1).

2, la forma de procesar la matriz de asignación analógica, se añadió hasta que el primer contador de bucle n, entonces observado leyes matemáticas. Cada generalmente toman el camino

 

 

 Pero este camino no es exacta, podemos modificarla. Entonces nos dimos cuenta de que cada elemento de la matriz a una misión, que siempre tiene una tendencia a girar

(Doblada en ángulo recto en sentido antihorario), pero no necesariamente exitosa. Presione la dirección de tiempo recta, la próxima vez continúan tienden a girar. Si usted puede dar vuelta la prioridad torneado, de lo contrario embarcarse en una

Antiguo.

 

 

 3, nota de que el tamaño de la matriz, límite (pared), pero también para registrar la asignación de cerca fronteriza real (salida cuando se utiliza).

4, en el formato de las notas. Esta pregunta es puedo dar formato a un largo tiempo.

Temas requisitos son los siguientes:

En la práctica, he hecho un montón de errores, el más típico

 

 Aparentemente sin ningún problema, pero después de la adición de caracteres visibles (espacios serán reemplazados con la salida de caracteres visibles, compruebe el formato) de la siguiente

 

 

 

Las tres últimas líneas se enfrentan a múltiples espacios de salida, debe ser eliminado!

 

Pues bien, el código completo

  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 }

 

Supongo que te gusta

Origin www.cnblogs.com/ManOK/p/12621320.html
Recomendado
Clasificación