我正在尝试解决一些问题。但是我的代码有问题。 问题是:给定数字n,以以下格式输出n * n。
输入:
n=3
输出:
7 8 1
6 9 2
5 4 3
这是我的代码:(我知道其中有一些错误,但是我无法修复。如果您有更好的主意,请帮助我。) 预先感谢。
#include<stdio.h>
#include<stdlib.h>
void oput(int **matrix,int n);
int main()
{ int x=0,y=0,n,k=1;
scanf("%d",&n);
int **matrix = malloc(sizeof(int)*n*n);
if(matrix==NULL)
{
perror("can't allocate");
return 1;
}
//Input values to x*y matrix
while(n>=1)
{
for(x=0,y=n-1;x<n;x++)
{
matrix[x][y]=k++;
}
for(x=n-1,y=n-1;y>=0;y--)
{
matrix[x][y]=k++;
}
for(x=n-1,y=0;x>=0;x--)
{
matrix[x][y]=k++;
}
n--;
}
oput(matrix,n);
free(matrix);
return 0;
}
//output values by row.
void oput(int **matrix,int n)
{
int i=0,j=0;
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
printf("%d ",matrix[i][j]);
}
printf("\n");
}
}
在运行时出现错误。
答案 0 :(得分:1)
只是为了好玩,我致力于解决这个问题。 我不允许在这个问题下写评论,所以我假设从矩阵的右上角开始“螺旋编号”是问题的必要条件。
我的解决方案是使用四个不同的循环在整个周长上加数字。然后再次开始添加缩进级别。
#include <stdio.h>
#include <string.h>
void printMatrix( int *nMatrix, int n, char *title )
{
int i, j;
if( title )
printf( "%s\n", title );
for( i=0; i<n; i++ )
{
for( j=0; j<n; j++ )
{
printf( "%d\t", *(nMatrix+n*i+j) );
}
printf( "\n" );
}
}
void main( int argc, char *argv[] )
{
if( argc == 2 )
{
int n = atoi ( argv[1] );
int i, j;
printf( "Input value: %d\n", n );
if( n > 0 && n <= 10 )
{
int spiral[n][n];
int indentNr, x, y, lastNr=0;
memset( spiral, 0, n*n*sizeof( int ));
/* As indentNr is incremented, inner frames are filled */
for( indentNr=0; n-2*indentNr>0; indentNr++ )
{
/* Go South */
for( x=indentNr, y=n-1-indentNr; x<n-indentNr; x++ )
{
spiral[x][y] = ++lastNr;
}
/* Go West (Village People, 1979) */
for( y=n-2-indentNr, x=n-1-indentNr; y>=indentNr; y-- )
{
spiral[x][y] = ++lastNr;
}
/* Go North */
for( x=n-2-indentNr, y=indentNr; x>=indentNr; x-- )
{
spiral[x][y] = ++lastNr;
}
/* Go East */
for( y=1+indentNr, x=indentNr; y<n-1-indentNr; y++ )
{
spiral[x][y] = ++lastNr;
}
}
/* Print results */
printMatrix( &(spiral[0][0]), n, "Final spiral:" );
}
else
{
printf( "ERROR: 'n' too big!\n" );
}
}
else
{
printf( "USAGE: spiral n\n" );
}
}
请注意: