Как я мог превратить этот жесткий код в l oop в C ++? - PullRequest
0 голосов
/ 17 марта 2020

Так что в основном я пытаюсь сделать эту матрицу (с двумерным массивом) в формате

1 

1 1
1 1

1 1 1
1 2 1
1 1 1

1 1 1 1
1 2 2 1
1 2 2 1
1 1 1 1 

1 1 1 1 1
1 2 2 2 1
1 2 3 2 1
1 2 2 2 1
1 1 1 1 1

в зависимости от того, какой размер вводит пользователь. Я могу сделать это с помощью жесткого кода, как показано:

#include <iostream>
#include <iomanip>

using namespace std;

int main() {
    int userSize;


    do {
        cin >> userSize;
        int userArray[userSize][userSize];
        int size = 1;
        int maxSize = 99;

        for (int i = 0; i < userSize; i++) {
            for (int j = 0; j < userSize; j++) {

                if ((j > 2 && j < userSize - 3) &&
                   (i > 2 && i < userSize - 3)){
                    userArray[i][j] = size + 3;
                }



                if ((j > 1 && j < userSize - 2) &&
                (i > 1 && i < userSize - 2)) {
                    userArray[i][j] = size + 2;
                }


                else if ((j > 0 && j < userSize - 1) &&
                    (i > 0 && i < userSize - 1)) {

                    userArray[i][j] = size + 1;
                }

                else {
                    userArray[i][j] = size;
                }

            }
        }

        for (int i = 0; i < userSize; i++) {
            for (int j = 0; j < userSize; j++) {
                cout << setw(3) << userArray[i][j];
            }
            cout << endl;
        }
        cout << endl;


    }while(userSize != 0);



    return 0;
}

, однако мне нужно быть в состоянии сделать это до 99, что, очевидно, будет много писать. Есть ли способ, которым я могу сделать это с некоторое время l oop вместо? Ниже моя неудачная попытка, которая выводит только мусор:


#include <iostream>
#include <iomanip>

using namespace std;

int main() {
    int userSize;
    int maxSize = 99;
    int size = 1;

    do {
        cin >> userSize;

        int myMatrix[userSize][userSize];

        for (int i = 0; i < userSize; i++) {
            for (int j = 0; j < userSize; j++) {

                while (maxSize >= 0) {

                    if ((j > maxSize) && (j < userSize - (maxSize + 1)) &&
                        ((i > maxSize) && (i < userSize - (maxSize + 1)))) {
                            myMatrix[i][j] = size + maxSize;
                        }

                    /*
                    if ((j > 1 && j < userSize - 2) &&
                    (i > 1 && i < userSize - 2)) {
                        myMatrix[i][j] = size + 2;
                    }


                    else if ((j > 0 && j < userSize - 1) &&
                        (i > 0 && i < userSize - 1)) {

                        myMatrix[i][j] = size + 1;
                    }
                    */

                    else {
                        myMatrix[i][j] = size;
                     }



                    maxSize = maxSize - 1;
                }
            }
        }

        for (int i = 0; i < userSize; i++) {
            for (int j = 0; j < userSize; j++) {
                cout << setw(3) << myMatrix[i][j];
            }
            cout << endl;
        }
        cout << endl;
    }while(userSize != 0);

    return 0;
}

1 Ответ

3 голосов
/ 17 марта 2020

выглядит так, как будто вы хотите минимальные шаги от внешнего края. Вот некоторый псевдо-код

int[,] ComputeMatrix(int m,int n)
{
     int[,] matrix = new int[m,n]
     for(int i = 0;i < m;i++)
     for(int j = 0;j < n;j++)
     {
          //Minimum distance from each of the 4 walls
          matrix[i,j] = 1 + Math.Min(Math.Min(Math.Min(i,j),m-i-1),n-j-1);
     }

      return matrix;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...