-2

您好我正在尝试以顺时针方向打印一个 4 x 4 矩阵,

输入:

1  2  3  4
12 13 14 5
11 16 15 6
10 9  8  7

预期输出为:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16

我的代码是:

 int MAXR=3,MAXC=3,MINR=0,MINC=0;

 while(MINR < MAXR && MINC < MAXC)
    {
        for(i=MINC;i<=MAXC;i++)
        {
            printf("%d  ",arr[MINR][i]);
        }

        for(j=MINR+1;j<=MAXR;j++)
        {
            printf("%d  ",arr[j][MAXC]);
        }

        for(i=MAXC-1;i>=MINC;i--)
        {
            printf("%d  ",arr[MAXR][i]);
        }

        MINR++;
        if((MINR%2)==0)
        {
            MINC=MINC+2;
        }
        //MAXR--;
        //MAXC--;
        //printf("\nMAXR=%d MINR=%d\n",MAXR,MINR);
        for(j=MAXR-1;j>MINR;j--)
        {
            printf("%d  ",arr[j][MINC]);
        }

        MAXR--;
        MAXC--;
    }

但输出是:1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 11

请帮我修复错误!谢谢!

输出是:

4

2 回答 2

0

以下代码将帮助您顺时针打印任意大小(行/列)的矩阵。

void printMatrixClockwisely(int** numbers, int rows, int columns)
{
    if(numbers == NULL || columns <= 0 || rows <= 0)
        return;

    int start = 0;

    while(columns > start * 2 && rows > start * 2)
    {
        PrintMatrixInCircle(numbers, columns, rows, start);

        ++start;
    }
}

void printNumber(int number)
{
    printf("%d\t", number);
}

void PrintMatrixInCircle(int** numbers, int columns, int rows, int start)
{
    int endX = columns - 1 - start;
    int endY = rows - 1 - start;

    // print a row from left to right
    for(int i = start; i <= endX; ++i)
    {
        int number = numbers[start][i];
        printNumber(number);
    }

    // print a col from up to down
    if(start < endY)
    {
        for(int i = start + 1; i <= endY; ++i)
        {
            int number = numbers[i][endX];
            printNumber(number);
        }
    }

    // print a row from right to left
    if(start < endX && start < endY)
    {
        for(int i = endX - 1; i >= start; --i)
        {
            int number = numbers[endY][i];
            printNumber(number);
        }
    }

    // print a col from down to up
    if(start < endX && start < endY - 1)
    {
        for(int i = endY - 1; i >= start + 1; --i)
        {
            int number = numbers[i][start];
            printNumber(number);
        }
    }
}
于 2013-12-17T14:37:40.023 回答
0

我希望你现在已经修复了你的缺陷。但这是一个有趣的规范,所以这是我的版本:

gcc (GCC) 4.7.3: gcc -Wall -Wextra -std=c99spiral.c

#include <stdio.h>

int main() {

  int matrix[4][4] = {
    {  1,  2,  3,  4 },
    { 12, 13, 14,  5 },
    { 11, 16, 15,  6 },
    { 10,  9,  8,  7 } };

  int edge = sizeof(matrix[0]) / sizeof(int) - 1;
  int i = 0;
  int j = 0;

  printf("%d ", matrix[i][j]);
  for (int c = 0; c < edge; ++c) { printf("%d ", matrix[i][++j]); }

  while (0 < edge) {
    for (int c = 0; c < edge; ++c) { printf("%d ", matrix[++i][j]); }
    for (int c = 0; c < edge; ++c) { printf("%d ", matrix[i][--j]); }
    --edge;
    for (int c = 0; c < edge; ++c) { printf("%d ", matrix[--i][j]); }
    for (int c = 0; c < edge; ++c) { printf("%d ", matrix[i][++j]); }
    --edge;
  }

  return 0;
}

我的方法是写出所需更改的顺序ij找到模式。我发现该模式出现在第一行之后,因此我将其作为单独的初始步骤进行。

于 2013-09-14T17:52:25.220 回答