-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=c99 スパイラル.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 に答える