63 matriz
Autor:
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 }