Моя функция должна случайным образом вставить выбранное пользователем число 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("");
}
}
Это домашнее задание, да?
Несколько вопросов:
matrix
, которую вы не используете.a[k][l] = 1;
до того, как узнаете, каким было старое значение, и поэтому не можете сказать, следует ли увеличивать m
или нет.m
и все элементы массива вокруг a[k][l]
. Никто не хочет смотреть на беспорядочный код, если ему не платят. Они просто будут считать, что это неправильно. Так что эта часть кода по определению неверна, и никто не может сказать вам, почему.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
хранит размер вашей матрицы. Используй это.
В моем коде все еще есть некоторые проблемы, но теперь он намного читабельнее, и я уверен, что скоро я смогу найти решение. Если вы хотите взглянуть, код находится в отредактированном сообщении. В любом случае, большое спасибо за вашу драгоценную помощь.
После создания координат i и j вы должны рассчитать расстояние между этой ячейкой и другими ячейками, равными 1. Для этого вы можете использовать формулу Манхэттена. Если расстояние между вновь сгенерированной ячейкой и другими ячейками, для которых установлено значение 1, больше или равно 1, вы можете продолжить и сгенерировать другие, в противном случае вы должны установить его обратно в ноль и сгенерировать новые координаты.
Можете ли вы показать мне несколько строк кода? Как я могу узнать, где находятся все остальные ячейки, установленные на 1?
@ChiaraTumminelli, вы должны сохранить координаты других ячеек в структуре данных (массив или связанный список). distance = sqrt(pow((x1 - x2), 2) + pow((y1 - y2), 2));
x1,y1 — координаты первой ячейки, а x2,y2 — координаты другой. Если расстояние >= 1, то две ячейки достаточно удалены друг от друга.
Я попытался написать функцию, мне нужно понять, как вставить координаты в новый массив и сделать проверку на всем массиве. Вы можете помочь мне? Я отредактировал сообщение с измененным кодом.
Моя цель не в том, чтобы «позволить вам сделать мою домашнюю работу», а в том, чтобы понять, что я делаю неправильно. Это будет небольшая часть проекта (где мне, конечно, не нужно заполнять матрицу нулями и единицами). Это упражнение, которое я делаю для себя, чтобы понять, как это работает, чтобы я мог делать свой проект с большей осознанностью. В любом случае, я нашел ваш совет очень ценным.