以特殊格式输出一些值

时间:2019-09-28 10:06:18

标签: c

我正在尝试解决一些问题。但是我的代码有问题。 问题是:给定数字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");
    }
}

在运行时出现错误。

1 个答案:

答案 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" );
  }
}

请注意:

  1. 输入'n'时插入主参数(无scanf)
  2. 我将n限制为10
  3. 此解决方案是迭代的。我没有分析递归解决方案
  4. 对于n = 1和n = 2的内部帧,跳过所有4个循环可能是一个更优雅的解决方案。我没有花很多时间来弄清楚
  5. 我测试了奇数和偶数场景,并且两者似乎都可以正常工作。我测试了n = 10。我不希望大数目的麻烦(大数目情况下的演示问题除外),但是请随时向我报告任何错误。