Ваша функция не будет выполнять тщательный тест, потому что вы сбрасываете j
и k
на 0
внутри внутреннего l oop, но, поскольку k
увеличивается до следующей итерации, matrix[0][0]
не будет сравнивать со следующим элементом массива, поэтому вывод будет неполным, если matrix[0][0]
не самый маленький элемент в матрице.
Обратите внимание, что n
не используется, и неясно, что этот аргумент должен быть. Кроме того, функция определена как возвращающая int
, но ничего не возвращает.
Смущает и подвержен ошибкам изменение переменных индекса l oop внутри тела l oop. Вы можете просто написать 3 вложенных цикла: для перечисления ячеек матрицы в порядке появления в массиве вы можете выполнить итерацию внешнего l oop для элементов массива и выполнить итерации по строкам и столбцам матрицы во внутренних циклах:
void find_path(int matrix_1[3][3], int array_1[9], int n) {
int i, j, k;
for (i = 0; i < 9; i++) {
for (j = 0; j < 3; j++) {
for (k = 0; k < 3; k++) {
if (matrix_1[j][k] == array_1[i]) {
printf("(%d, %d)", j, k);
break;
}
}
if (k < 3)
break;
}
}
}
Приведенный выше код выведет ту же ячейку матрицы для повторяющихся значений. Если нет повторяющихся значений, операторы break
и второй оператор if
могут быть удалены.
Вот простое исправление в вашем коде:
int find_path(int matrix_1[3][3], int array_1[9], int n) {
int i = 0;
for (int j = 0; j < 3; j++) {
for (int k = 0; k < 3; k++) {
if (matrix_1[j][k] == array_1[i]) {
printf("(%d, %d)", j, k);
if (++i == 9)
return i;
j = 0;
k = -1; // restart the inner loop at 0,0
}
}
}
return i; // return the number of values found.
}