Форум 1С
Программистам, бухгалтерам, администраторам, пользователям
Задай вопрос - получи решение проблемы
14 дек 2024, 02:05

Трёхмерный массив, непонятная логика работы программы

Автор Romanhmel, 09 мар 2023, 17:16

0 Пользователей и 1 гость просматривают эту тему.

Romanhmel

Добрый день !
Я только начинаю изучать 1С. И ради интереса изучения массивов перенёс программу из С++ на 1С. На плюсах всё работает https://onlinegdb.com/e_9pH7hTJ а на 1С- почему-то нет. В конце цикла идёт распечатка всех элементов массива (которые являются двумерными массивами), однако несмотря на то, что кол-во элементов больше одного, но распечатывается всегда одна матрица. Также если перед удалением элемента и после поставить функцию Print, то кол-во уменьшается на 1, но сам элемент не удаляется на самом деле (т.е. выводится одна и та же матрица, хотя элемент должен быть удалён). Если вместо массива для хранения матриц использовать СписокЗначений, то выводится ошибка "Доступ по индексу к элементу не может быть определён", даже если использовать функцию Получить вместо квадратных скобок. Не пойму в чём причина, казалось бы программы одинаковые.
Процедура PrintSudoku(board)
Для i=0 по board.ВГраница() цикл
строчка = "";
Для j=0 по board.ВГраница() цикл
строчка = строчка + "   " + board[i][j];
КонецЦикла;
        Сообщить(строчка);
КонецЦикла;
Сообщить("*****************************************");
КонецПроцедуры
Функция ValidSudoku(board, Знач row, Знач col, Знач c)
Для i=0 по 8 цикл
Если (board[i][col]= c) тогда
Возврат Ложь;
КонецЕсли;
Если (board[row][i]= c) тогда
Возврат Ложь;
КонецЕсли;                 
Если (board[3*Цел(row/3) + Цел(i/3)][ 3*Цел(col/3) + i%3] = c) тогда
Возврат Ложь;
КонецЕсли;
КонецЦикла;
Возврат Истина;
КонецФункции
Процедура solveSudoku (Знач board)
tochka = Истина;
baza = Новый Массив;
nabor = Новый Массив;
    baza.Добавить(board);
nabor.Добавить(0);
Пока (baza.Количество() > 0)  цикл
x = -1;
y = -1;
tochka = Ложь;
Для i=0 по 8 цикл
Для j=0 по 8 цикл
Если baza[baza.Количество()-1][i][j] = 0 тогда
tochka = Истина;
Если (x= -1) тогда
x = i;
y = j;
Прервать;
КонецЕсли
КонецЕсли
КонецЦикла
КонецЦикла;
Если (Не tochka) тогда
Прервать;
КонецЕсли;
ok = Ложь;
Для c = nabor[nabor.Количество()-1] + 1 по 9 цикл
//Сообщить ("Пытаюсь вставить: " + c);
Если ValidSudoku(baza[baza.Количество()-1] , x, y, c) тогда
ok = Истина;
nabor.Удалить(nabor.Количество()-1);
nabor.Добавить(c);
nabor.Добавить(0);
b = Новый Массив;
b = baza[baza.Количество()-1];
b[x][y] = c;
baza.Добавить(b);
Прервать;
КонецЕсли
КонецЦикла;
Если (Не ok) тогда
baza.Удалить(baza.Количество() - 1);
            nabor.Удалить(nabor.Количество() - 1);
КонецЕсли;
Если baza.Количество() > 0 тогда
//PrintSudoku(baza[baza.Количество()-1]);
Иначе
Сообщить ("пусто");
КонецЕсли;
Для каждого g из baza цикл   
Сообщить("БАЗА: "+ " Кол-во=" + baza.Количество());
PrintSudoku(g);
КонецЦикла;
КонецЦикла;
Возврат;
КонецПроцедуры                   
Процедура ПриНачалеРаботыСистемы()                 
доска = Новый Массив (9,9);
доска [0][0] = 0;
доска [0][1] = 0;
доска [0][2] = 8;
доска [0][3] = 9;
доска [0][4] = 0;
доска [0][5] = 7;
доска [0][6] = 0;
доска [0][7] = 5;
доска [0][8] = 0;

доска [1][0] = 0;
доска [1][1] = 7;
доска [1][2] = 0;
доска [1][3] = 0;
доска [1][4] = 4;
доска [1][5] = 0;
доска [1][6] = 0;
доска [1][7] = 1;
доска [1][8] = 0;

доска [2][0] = 0;
доска [2][1] = 6;
доска [2][2] = 0;
доска [2][3] = 5;
доска [2][4] = 0;
доска [2][5] = 1;
доска [2][6] = 0;
доска [2][7] = 0;
доска [2][8] = 7;

доска [3][0] = 6;
доска [3][1] = 3;
доска [3][2] = 0;
доска [3][3] = 0;
доска [3][4] = 0;
доска [3][5] = 0;
доска [3][6] = 9;
доска [3][7] = 0;
доска [3][8] = 0;

доска [4][0] = 0;
доска [4][1] = 0;
доска [4][2] = 9;
доска [4][3] = 0;
доска [4][4] = 0;
доска [4][5] = 0;
доска [4][6] = 8;
доска [4][7] = 0;
доска [4][8] = 0;

доска [5][0] = 0;
доска [5][1] = 0;
доска [5][2] = 7;
доска [5][3] = 4;
доска [5][4] = 0;
доска [5][5] = 0;
доска [5][6] = 0;
доска [5][7] = 3;
доска [5][8] = 5;

доска [6][0] = 7;
доска [6][1] = 0;
доска [6][2] = 0;
доска [6][3] = 6;
доска [6][4] = 0;
доска [6][5] = 3;
доска [6][6] = 0;
доска [6][7] = 2;
доска [6][8] = 0;

доска [7][0] = 0;
доска [7][1] = 4;
доска [7][2] = 0;
доска [7][3] = 0;
доска [7][4] = 7;
доска [7][5] = 0;
доска [7][6] = 0;
доска [7][7] = 6;
доска [7][8] = 0;

доска [8][0] = 0;
доска [8][1] = 0;
доска [8][2] = 6;
доска [8][3] = 1;
доска [8][4] = 0;
доска [8][5] = 4;
доска [8][6] = 7;
доска [8][7] = 0;
доска [8][8] = 0;
solveSudoku (доска);
КонецПроцедуры

LexaK

Romanhmel, попробуйте ключевое слово Знач убрать
так

Процедура solveSudoku (board)
если помогло нажмите: Спасибо!

Romanhmel


Afinogen

вот эта процедура что делает?

Процедура PrintSudoku(board)
    Для i=0 по board.ВГраница() цикл
        строчка = "";
        Для j=0 по board.ВГраница() цикл
            строчка = строчка + "   " + board[i][j];
        КонецЦикла;
        Сообщить(строчка);       
    КонецЦикла;
    Сообщить("*****************************************");
КонецПроцедуры

у вас получается board -это массив каждый элемент которого  также массив, но  вы зачем то для каждого элемента каждый раз снова пробегаете по массиву

Romanhmel

Afinogen, Эта процедура выводит в сообщения все элементы двумерного массива. Конкатенацию строк сделал, чтобы просто в одной строке несколько элементов было (чтобы более менее в приятном виде выводилось). Строку кода
Для j=0 по board.ВГраница() цикл я пробовал заменить на Для j=0 по board[i].ВГраница() цикл От этого ничего не изменилось. Это ведь я так понимаю просто кол-во итераций цикла, а так как массив квадратный то и разницы нет.

Теги:

Похожие темы (5)

Рейтинг@Mail.ru

Поиск