Почему печатается неправильное число 1?

Моя функция должна случайным образом вставить выбранное пользователем число 1 в мою матрицу. Сложность заключается в том, что если ячейка содержит 1, ячейки вокруг нее должны быть установлены на 0. Почему мой код печатает неправильное число 1? В приведенном ниже коде я думал сначала установить всю матрицу в 0, а затем случайным образом сгенерировать ячейку, для которой будет установлено значение 1, после проверки, что она содержит 0, а расстояние между этой ячейкой и другими ячейками, содержащими 1, равно >= 1. Все это делается до тех пор, пока введенное пользователем число m не станет равным 0.

#include <stdio.h>
#include <stdlib.h>
#include <math.h>

void initialize(int n, int a[n][n]);
void createMap(int n, int a[n][n], int m);
int check (int i, int j, int v, int w);
void print(int n, int a[n][n]);

int main(){
    
    int n;
    printf("Insert square matrix size: ");
    scanf("%d", &n);
    
    int m;
    printf("Insert 1s number: ");
    scanf("%d", &m);
    
    int a[n][n];
    
    initialize(n,a);
    createMap(n,a,m);
    
}

//Filling the matrix with 0
void initialize(int n, int a[n][n]){
    for (int i = 0; i < n; i++){
        for (int j = 0; j < n; j++){
            a[i][j] = 0;
        }
    }
}

//Setting in random position 1 value
void createMap(int n, int a[n][n], int m){
    int x1; int x2;
    int b[0][0];
    while (m > 0){
        int i = rand() % n;
        int j = rand() % n;
        if (a[i][j] == 0 && (check(i,j,x1,x2) == 1)){
            a[i][j] = 1;
            m--;
            //I have to fill b array with coordinates and then to pass
            //b array to check function to do the check in the whole b array
        }
    }
    print(n,a);
}

//checking if I can set the value to 1
int check (int x1, int y1, int x2, int y2){
    if (sqrt(pow((x1-x2),2) + pow((y1-y2),2)) >= 1){
        return 1;
    } else {
        return 0;
    }
}

//Printing the matrix
void print(int n, int a[n][n]){
    for (int i = 0; i < n; i++){
        for (int j = 0; j < n; j++){
            printf("\t%d",a[i][j]);
        }
        puts("");
    }
}
Структурированный массив Numpy
Структурированный массив Numpy
Однако в реальных проектах я чаще всего имею дело со списками, состоящими из нескольких типов данных. Как мы можем использовать массивы numpy, чтобы...
T - 1Bits: Генерация последовательного массива
T - 1Bits: Генерация последовательного массива
По мере того, как мы пишем все больше кода, мы привыкаем к определенным способам действий. То тут, то там мы находим код, который заставляет нас...
Что такое деструктуризация массива в JavaScript?
Что такое деструктуризация массива в JavaScript?
Деструктуризация позволяет распаковывать значения из массивов и добавлять их в отдельные переменные.
2
0
129
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Это домашнее задание, да?

Несколько вопросов:

  1. У вас есть переменная matrix, которую вы не используете.
  2. Вы устанавливаете a[k][l] = 1; до того, как узнаете, каким было старое значение, и поэтому не можете сказать, следует ли увеличивать m или нет.
  3. Ваша проверка границ беспорядочна, трудно понять, правильна ли она, и правильно ли вы обновляете m и все элементы массива вокруг a[k][l]. Никто не хочет смотреть на беспорядочный код, если ему не платят. Они просто будут считать, что это неправильно. Так что эта часть кода по определению неверна, и никто не может сказать вам, почему.
  4. Ваша проверка границ предполагает, что у вас есть массив 4x4.

... и некоторые другие.

Пункт 1 легко исправить, да это и не важно. Это только добавляет уродства вашему коду.

Пункт 2 решается только обновлением a[k][l] и m, если a[k][l] было равно нулю:

if (a[k][l] == 0)
  {
    a[k][l] = 1;
    m--;
  }

Пункт 3 проще всего исправить, создав отдельную функцию, которая выполняет сброс отдельных элементов массива с проверкой границ. Поскольку я предполагаю, что это домашнее задание, я не буду писать это для вас, если только вы сначала не попробуете сами. Сигнатура функции может выглядеть так:

/*
   Set value of `a[line][column]` to zero and increment `*m` if value
   was changed.
   Nothing is done if `line` or `column` are out of bounds.
*/
 void matrix_element_reset(int n, a[n][n], int line, int column, int *m);

Затем вы можете легко сбросить элементы массива вокруг a[k][l] следующим образом:

/* This can be simplified with loops */
matrix_element_reset(n, a, k-1, l, &m);
matrix_element_reset(n, a, k, l, &m);
matrix_element_reset(n, a, k+1, l, &m);
.....

Пункт 4: Ваша переменная n хранит размер вашей матрицы. Используй это.

Моя цель не в том, чтобы «позволить вам сделать мою домашнюю работу», а в том, чтобы понять, что я делаю неправильно. Это будет небольшая часть проекта (где мне, конечно, не нужно заполнять матрицу нулями и единицами). Это упражнение, которое я делаю для себя, чтобы понять, как это работает, чтобы я мог делать свой проект с большей осознанностью. В любом случае, я нашел ваш совет очень ценным.

Chiara Tumminelli 25.12.2020 07:02

В моем коде все еще есть некоторые проблемы, но теперь он намного читабельнее, и я уверен, что скоро я смогу найти решение. Если вы хотите взглянуть, код находится в отредактированном сообщении. В любом случае, большое спасибо за вашу драгоценную помощь.

Chiara Tumminelli 25.12.2020 07:02
Ответ принят как подходящий

После создания координат i и j вы должны рассчитать расстояние между этой ячейкой и другими ячейками, равными 1. Для этого вы можете использовать формулу Манхэттена. Если расстояние между вновь сгенерированной ячейкой и другими ячейками, для которых установлено значение 1, больше или равно 1, вы можете продолжить и сгенерировать другие, в противном случае вы должны установить его обратно в ноль и сгенерировать новые координаты.

Можете ли вы показать мне несколько строк кода? Как я могу узнать, где находятся все остальные ячейки, установленные на 1?

Chiara Tumminelli 25.12.2020 14:52

@ChiaraTumminelli, вы должны сохранить координаты других ячеек в структуре данных (массив или связанный список). distance = sqrt(pow((x1 - x2), 2) + pow((y1 - y2), 2)); x1,y1 — координаты первой ячейки, а x2,y2 — координаты другой. Если расстояние >= 1, то две ячейки достаточно удалены друг от друга.

Enrico 25.12.2020 15:16

Я попытался написать функцию, мне нужно понять, как вставить координаты в новый массив и сделать проверку на всем массиве. Вы можете помочь мне? Я отредактировал сообщение с измененным кодом.

Chiara Tumminelli 25.12.2020 18:04

Другие вопросы по теме