Compare commits

..

1231 Commits

Author SHA1 Message Date
2735239aca Merge pull request '[0] initial commit' (#351) from BrychkinKA/2026-rff_mp:BrychkinKA into develop
Reviewed-on: UNN/2026-rff_mp#351
2026-05-30 12:10:33 +00:00
186cd9f688 Merge pull request '[2] task2' (#310) from nehoroshevaa/2026-rff_mp:Task2 into develop
Reviewed-on: UNN/2026-rff_mp#310
2026-05-30 12:07:49 +00:00
210ea8ece8 Merge pull request '[1] Task' (#283) from Anton_Vinichuk/2026-rff_mp_ViniuchukAN:Task1(vinichukan) into develop
Reviewed-on: UNN/2026-rff_mp#283
2026-05-30 12:07:14 +00:00
a4d9a226c1 Merge pull request '[2] exit_from_maze' (#352) from pomelovsd/2026-rff_mp:exit_from_maze into develop
Reviewed-on: UNN/2026-rff_mp#352
2026-05-30 12:07:11 +00:00
bcdaf65dbc Merge pull request '[1] lab1, lab2' (#251) from pogodinda/2026-rff_mp:pogodinda into develop
Reviewed-on: UNN/2026-rff_mp#251
2026-05-30 12:06:38 +00:00
cec177e26d Merge pull request '[2] 2-nd-exercise' (#266) from KuznetsovYuM/2026-rff_mp:2-nd-exercise into develop
Reviewed-on: UNN/2026-rff_mp#266
2026-05-30 12:06:13 +00:00
2d36dd7ef3 Merge pull request '[2]' (#344) from novikovsd/2026-rff_mp:lab2 into develop
Reviewed-on: UNN/2026-rff_mp#344
2026-05-30 12:05:47 +00:00
ad704a27ab Merge pull request '[2] labirint' (#209) from smirnovad/2026-rff_mp:lab2 into develop
Reviewed-on: UNN/2026-rff_mp#209
2026-05-30 12:05:27 +00:00
3b1c21a8b1 Merge pull request '[1] lab1' (#190) from shalovsa/2026-rff_mp:lab1 into develop
Reviewed-on: UNN/2026-rff_mp#190
2026-05-30 12:04:39 +00:00
7f540020bc Merge pull request '[2] Лабораторная работа №2' (#300) from bolonkinnm/2026-rff_mp:Task2 into develop
Reviewed-on: UNN/2026-rff_mp#300
2026-05-30 12:03:47 +00:00
52fbd9c2b1 Merge pull request '[2] 2-nd-exercise' (#318) from BoriskovaDV/2026-rff_mp:2-nd-exercise into develop
Reviewed-on: UNN/2026-rff_mp#318
2026-05-30 12:03:40 +00:00
8deead6d69 Merge pull request '[2] 2-st-exercise' (#356) from volkovva/2026-rff_mp:2-st-exercise into develop
Reviewed-on: UNN/2026-rff_mp#356
2026-05-30 12:03:13 +00:00
c5eef27dc9 Merge pull request '[2] task2' (#311) from volkovim/2026-rff_mp:task2 into develop
Reviewed-on: UNN/2026-rff_mp#311
2026-05-30 12:03:05 +00:00
50e38b4d79 Обновить .gitignore 2026-05-30 12:02:46 +00:00
87269b78c5 Merge pull request '[2] Лабораторная работа №2 - Лабиринт' (#280) from stepushovgs/2026-rff_mp:lab2-pure into develop
Reviewed-on: UNN/2026-rff_mp#280
2026-05-30 12:02:42 +00:00
714f25fc82 Merge pull request '[1] zadanie_1' (#194) from zverevem/2026-rff_mp:lab1 into develop
Reviewed-on: UNN/2026-rff_mp#194
2026-05-30 12:02:24 +00:00
78eaf79bc4 Merge pull request '[2] maze' (#260) from SobolevNS/2026-rff_mp:02 into develop
Reviewed-on: UNN/2026-rff_mp#260
2026-05-30 12:01:59 +00:00
31190f84f5 Merge pull request '[1] Собинина А. - Задание 1: структуры данных' (#285) from sobininaas/2026-rff_mp:lab1 into develop
Reviewed-on: UNN/2026-rff_mp#285
2026-05-30 12:01:32 +00:00
d025768363 Merge pull request '[1,2] Первая и вторая лаба' (#357) from vasilevia/2026-rff_mp:develop into develop
Reviewed-on: UNN/2026-rff_mp#357
2026-05-30 12:01:02 +00:00
34eade7e8d Merge pull request '[1]' (#294) from novikovsd/2026-rff_mp:lab1 into develop
Reviewed-on: UNN/2026-rff_mp#294
2026-05-30 12:00:48 +00:00
a5777ae4bc Merge pull request '[1] 1-st-exercise FINAL' (#320) from semyanovra/2026-rff_mp:1-st-exercise into develop
Reviewed-on: UNN/2026-rff_mp#320
2026-05-30 12:00:46 +00:00
0b1738c0ff Merge pull request '[2] YaroslavtsevAS-lab2' (#298) from YaroslavtsevAS/2026-rff_mp:YaroslavtsevAS-lab2 into develop
Reviewed-on: UNN/2026-rff_mp#298
2026-05-30 12:00:16 +00:00
f5cb490725 Merge pull request '[2] maze solver' (#282) from Anton_Vinichuk/2026-rff_mp_ViniuchukAN:Maze(vinichukan) into develop
Reviewed-on: UNN/2026-rff_mp#282
2026-05-30 11:59:47 +00:00
991b843cec Merge pull request '[2] maze' (#308) from svetlakovkyu/2026-rff_mp:02 into develop
Reviewed-on: UNN/2026-rff_mp#308
2026-05-30 11:59:32 +00:00
7fcff47515 Merge pull request '[2] task2' (#289) from groshevava/2026-rff_mp:task2 into develop
Reviewed-on: UNN/2026-rff_mp#289
2026-05-30 11:59:03 +00:00
e718740494 Merge pull request '[1] задание 1' (#187) from krasnovia/2026-rff_mp:lab1 into develop
Reviewed-on: UNN/2026-rff_mp#187
2026-05-30 11:57:50 +00:00
a43956a823 Merge pull request '[1]task1' (#321) from kuzminskiyaa/2026-rff_mp:task1 into develop
Reviewed-on: UNN/2026-rff_mp#321
2026-05-30 11:57:34 +00:00
7e1a9c1dba Merge pull request '[1] 1-st-exercise' (#315) from BoriskovaDV/2026-rff_mp:1-st-exercise into develop
Reviewed-on: UNN/2026-rff_mp#315
2026-05-30 11:56:51 +00:00
db85133d0c Merge pull request '[2] task2' (#343) from kuznetsovTD/2026-rff_mp:task2 into develop
Reviewed-on: UNN/2026-rff_mp#343
2026-05-30 11:56:41 +00:00
178a3ac278 Merge pull request '[1][2] Labs' (#338) from skorohodovsa/2026-rff_mp:main into develop
Reviewed-on: UNN/2026-rff_mp#338
2026-05-30 11:56:39 +00:00
f105cea289 Merge pull request '[1]Laba1' (#203) from Mininavd/2026-rff_mp:MininaLaba1 into develop
Reviewed-on: UNN/2026-rff_mp#203
2026-05-30 11:56:15 +00:00
53c024e79d Merge pull request '[1,2] datastructure_task1, maze_task2' (#284) from ShulpinIN/2026-rff_mp:ShulpinIN into develop
Reviewed-on: UNN/2026-rff_mp#284
2026-05-30 11:55:25 +00:00
4b56346d15 Merge pull request '[2] labirint' (#210) from shalovsa/2026-rff_mp:lab2 into develop
Reviewed-on: UNN/2026-rff_mp#210
2026-05-30 11:55:21 +00:00
fca5e74d90 Merge pull request '[2] task2' (#255) from VildyaevAV/2026-rff_mp:VildyaevAV-task2 into develop
Reviewed-on: UNN/2026-rff_mp#255
2026-05-30 11:55:15 +00:00
d81df337aa Merge pull request '[2] 2-nd-exersize' (#246) from SavelevMI/2026-rff_mp:2-nd-exersize into develop
Reviewed-on: UNN/2026-rff_mp#246
2026-05-30 11:54:24 +00:00
c47ac035f6 Merge pull request '[1] data structures' (#182) from lomakinae/2026-rff_mp:data_structures into develop
Reviewed-on: UNN/2026-rff_mp#182
2026-05-30 11:54:19 +00:00
1b75244031 Merge pull request '[1 2] 1 и 2 Лаба Санчеса' (#305) from zelentsovav/2026-rff_mp:ZelentsovAV into develop
Reviewed-on: UNN/2026-rff_mp#305
2026-05-30 11:54:19 +00:00
0b409ad19b Merge pull request '[2] lab2' (#206) from chizhikovasm/2026-rff_mp:lab2 into develop
Reviewed-on: UNN/2026-rff_mp#206
2026-05-30 11:53:40 +00:00
c42887cdd4 Merge pull request '[1,2] struck-data, maze_task' (#336) from MarkinAM/2026-rff_mp:tasks into develop
Reviewed-on: UNN/2026-rff_mp#336
2026-05-30 11:53:30 +00:00
c6140866fc Merge pull request '[0] initial commit' (#157) from Nikita_Rovnov/2026-rff_mp:develop into develop
Reviewed-on: UNN/2026-rff_mp#157
2026-05-30 11:52:49 +00:00
4502a81d29 Merge pull request '[1] 1-st exersize' (#226) from gorkinmm/2026-rff_mp:GorkinMM into develop
Reviewed-on: UNN/2026-rff_mp#226
2026-05-30 11:52:31 +00:00
1f016b85f0 Merge pull request '[2]task2' (#322) from romanovpv/2026-rff_mp:task2 into develop
Reviewed-on: UNN/2026-rff_mp#322
2026-05-30 11:52:25 +00:00
4058e3b2f4 Merge pull request '[1, 2] task 1, task 2' (#180) from yanyaevaa/2026-rff_mp:task-1 into develop
Reviewed-on: UNN/2026-rff_mp#180
2026-05-30 11:51:42 +00:00
0423b103cc Merge pull request '[1] лаба 1' (#188) from MashinDD/2026-rff_mp:lab1 into develop
Reviewed-on: UNN/2026-rff_mp#188
2026-05-30 11:50:42 +00:00
41b913b317 Merge pull request '[2] 2-nd-exercise' (#200) from IvanBud123/2026-rff_mp:2-nd-exercise into develop
Reviewed-on: UNN/2026-rff_mp#200
2026-05-30 11:50:39 +00:00
0df82365b5 Merge pull request '[2] Собинина А. - Задание 2: лабиринт и паттерны GoF' (#348) from sobininaas/2026-rff_mp:lab2 into develop
Reviewed-on: UNN/2026-rff_mp#348
2026-05-30 11:50:35 +00:00
93fb15f301 Merge pull request '[1] task 1' (#258) from groshevava/2026-rff_mp:groshevava into develop
Reviewed-on: UNN/2026-rff_mp#258
2026-05-30 11:49:49 +00:00
33a5503164 Merge pull request '[1-2] Data structures and maze' (#297) from SokolovNE/2026-rff_mp:develop into develop
Reviewed-on: UNN/2026-rff_mp#297
2026-05-30 11:49:36 +00:00
f6d82124fc Merge pull request '[0] initial commit' (#221) from pavelkir/2026-rff_mp:KiryshkinPA into develop
Reviewed-on: UNN/2026-rff_mp#221
2026-05-30 11:48:51 +00:00
979a03c36f Merge pull request '[2]zadanie2' (#217) from zverevem/2026-rff_mp:zverevem into develop
Reviewed-on: UNN/2026-rff_mp#217
2026-05-30 11:48:46 +00:00
9b55830b58 Merge pull request '[2] Вторая лабораторная работа' (#253) from mylnikovas/2026-rff_mp:task_2 into develop
Reviewed-on: UNN/2026-rff_mp#253
2026-05-30 11:47:57 +00:00
5c7b6b0ac1 Merge pull request '[1]task1' (#201) from romanovpv/2026-rff_mp:task1 into develop
Reviewed-on: UNN/2026-rff_mp#201
2026-05-30 11:47:53 +00:00
0310e07589 Merge pull request '[2] 2-nd-exercize' (#215) from KislyuninED/2026-rff_mp:2-st-exercize into develop
Reviewed-on: UNN/2026-rff_mp#215
2026-05-30 11:47:13 +00:00
98d32c7cf1 Merge pull request '[1] 1-st-exercise' (#265) from KuznetsovYuM/2026-rff_mp:1-st-exercise into develop
Reviewed-on: UNN/2026-rff_mp#265
2026-05-30 11:46:57 +00:00
befc24663a Merge pull request '[1] 1-st-exercize' (#193) from KislyuninED/2026-rff_mp:1-st-exercize into develop
Reviewed-on: UNN/2026-rff_mp#193
2026-05-30 11:46:03 +00:00
372cbe7db4 Merge pull request '[1]SokolovEN' (#278) from SokolovEN/2026-rff_mp:SokolovEN into develop
Reviewed-on: UNN/2026-rff_mp#278
2026-05-30 11:45:56 +00:00
3a5e332d89 Merge pull request '[2] lab2' (#331) from borisovmi/2026-rff_mp:lab2 into develop
Reviewed-on: UNN/2026-rff_mp#331
2026-05-30 11:45:50 +00:00
2fe4c1bb75 Merge pull request '[1] lab1' (#277) from zhigalovrd/2026-rff_mp:zhigalovrd into develop
Reviewed-on: UNN/2026-rff_mp#277
2026-05-30 11:45:12 +00:00
b41bf0e9f3 Merge pull request '[1]lab1' (#208) from smirnovad/2026-rff_mp:lab11 into develop
Reviewed-on: UNN/2026-rff_mp#208
2026-05-30 11:44:28 +00:00
b54e87ad1c Merge pull request '[2] lab2' (#238) from shekurovaa/2026-rff_mp:zad2 into develop
Reviewed-on: UNN/2026-rff_mp#238
2026-05-30 11:44:23 +00:00
590204844a Merge pull request '[1] for 1-st ex' (#228) from fomichevks/2026-rff_mp:fomichevks into develop
Reviewed-on: UNN/2026-rff_mp#228
2026-05-30 11:43:46 +00:00
fabb5cd5c1 Merge pull request '[1] data structures' (#259) from SobolevNS/2026-rff_mp:01 into develop
Reviewed-on: UNN/2026-rff_mp#259
2026-05-30 11:42:56 +00:00
d9a501b086 Merge pull request '[2] zadanie2' (#231) from shahovaa/2026-rff_mp:zadanie2 into develop
Reviewed-on: UNN/2026-rff_mp#231
2026-05-30 11:42:42 +00:00
b4073c69a4 Merge pull request '[2] labirint' (#211) from MashinDD/2026-rff_mp:lab2 into develop
Reviewed-on: UNN/2026-rff_mp#211
2026-05-30 11:42:07 +00:00
42999d4181 Merge pull request '[1] Лабораторная работа №1 "Структуры данных"' (#198) from stepushovgs/2026-rff_mp:stepushovgs into develop
Reviewed-on: UNN/2026-rff_mp#198
2026-05-30 11:40:36 +00:00
6bf6bc0c5f Merge pull request '[1] Первая лабораторная работа' (#235) from mylnikovas/2026-rff_mp:task_1 into develop
Reviewed-on: UNN/2026-rff_mp#235
2026-05-30 11:40:29 +00:00
5e3f0b10e7 Merge pull request '[2] lab2' (#350) from BrychkinKA/2026-rff_mp:task2 into develop
Reviewed-on: UNN/2026-rff_mp#350
2026-05-30 11:40:27 +00:00
f36e519a20 Merge pull request '[1,2] lab1, lab2' (#273) from soldatkinao/2026-rff_mp:soldatkinao into develop
Reviewed-on: UNN/2026-rff_mp#273
2026-05-30 11:40:26 +00:00
1dedd07bc3 Merge pull request '[1] 1-st exersize' (#225) from SolovevDD/2026-rff_mp:SolovevDD_zadanie1 into develop
Reviewed-on: UNN/2026-rff_mp#225
2026-05-30 11:39:21 +00:00
aeb797e271 Merge pull request '[1] 1-st exercise' (#342) from agafonovdm/2026-rff_mp:agafonovdm into develop
Reviewed-on: UNN/2026-rff_mp#342
2026-05-30 11:39:18 +00:00
f713dc3e6a Merge pull request '[2] lab2' (#241) from krasnovia/2026-rff_mp:lab2 into develop
Reviewed-on: UNN/2026-rff_mp#241
2026-05-30 11:39:17 +00:00
4f25ffe3b5 Merge pull request '[2] task_2 Completed' (#191) from zaharoves/2026-rff_mp:zadanie_2 into develop
Reviewed-on: UNN/2026-rff_mp#191
2026-05-30 11:38:17 +00:00
e47b0a93c7 Merge pull request '[1] 1-st-exersize' (#245) from SavelevMI/2026-rff_mp:1-st-exersize into develop
Reviewed-on: UNN/2026-rff_mp#245
2026-05-30 11:37:53 +00:00
78ec64cb91 Merge pull request '[1,2] struck-data-task1, maze_task2' (#313) from nikolaevda/2026-rff_mp:nikolaevda into develop
Reviewed-on: UNN/2026-rff_mp#313
2026-05-30 11:37:49 +00:00
14c0a27319 Merge pull request '[1] task1 data structures' (#183) from svetlakovkyu/2026-rff_mp:01 into develop
Reviewed-on: UNN/2026-rff_mp#183
2026-05-30 11:36:45 +00:00
ec1d4f155d Merge pull request '[1] data_structures' (#186) from pomelovsd/2026-rff_mp:data_structures into develop
Reviewed-on: UNN/2026-rff_mp#186
2026-05-30 11:35:57 +00:00
c4be844d2c Merge pull request '[1] data structures' (#248) from VildyaevAV/2026-rff_mp:VildyaevAV-task1 into develop
Reviewed-on: UNN/2026-rff_mp#248
2026-05-30 11:35:50 +00:00
81964eb444 Merge pull request '[1] laba1' (#325) from dyachenkoas/2026-rff_mp:dyachenkoas-laba-1 into develop
Reviewed-on: UNN/2026-rff_mp#325
2026-05-30 11:35:39 +00:00
0539c6b573 Merge pull request '[2] lab_2 and lab_1 finished and merged' (#197) from gutovvm/2026-rff_mp:GutovVM into develop
Reviewed-on: UNN/2026-rff_mp#197
2026-05-30 11:35:37 +00:00
0e945052fc Merge pull request '[1] trask1' (#178) from volkovim/2026-rff_mp:volkovim into develop
Reviewed-on: UNN/2026-rff_mp#178
2026-05-30 11:34:34 +00:00
98f567dc82 Merge pull request '[1] Лабораторная работа №1:' (#257) from YaroslavtsevAS/2026-rff_mp:YaroslavtsevAS-lab1 into develop
Reviewed-on: UNN/2026-rff_mp#257
2026-05-30 11:34:31 +00:00
27f51cfb57 Merge pull request '[1, 2] task1 & task2' (#181) from solovevds/2026-rff_mp:SolovevDS-task1 into develop
Reviewed-on: UNN/2026-rff_mp#181
2026-05-30 11:34:23 +00:00
0a0e3edd39 Merge pull request '[2]MininaLaba2-clean' (#236) from Mininavd/2026-rff_mp:MininaLaba2-clean into develop
Reviewed-on: UNN/2026-rff_mp#236
2026-05-30 11:32:55 +00:00
f2aa20ced7 Merge pull request '[1] task 1' (#179) from kuznetsovTD/2026-rff_mp:Task1 into develop
Reviewed-on: UNN/2026-rff_mp#179
2026-05-30 11:32:46 +00:00
f40cef0d15 Merge pull request '[2]lab2' (#306) from tseremonnikovaaa/2026-rff_mp:tseremonnikovaaa-lab2 into develop
Reviewed-on: UNN/2026-rff_mp#306
2026-05-30 11:32:23 +00:00
b7274bb9db Merge pull request '[2]Task 2' (#334) from kuzminskiyaa/2026-rff_mp:main into develop
Reviewed-on: UNN/2026-rff_mp#334
2026-05-30 11:32:20 +00:00
f907f973d9 Merge pull request '[1] task 1' (#207) from osipovamd/2026-rff_mp:osipovamd into develop
Reviewed-on: UNN/2026-rff_mp#207
2026-05-30 11:32:16 +00:00
b55718f0c1 Merge pull request '[1] task1' (#177) from nehoroshevaa/2026-rff_mp:nehoroshevaa into develop
Reviewed-on: UNN/2026-rff_mp#177
2026-05-30 11:31:08 +00:00
0b482ef4e5 Merge pull request '[1] Task 1: complete phonebook structures with report and graphs' (#176) from chizhikovasm/2026-rff_mp:task1 into develop
Reviewed-on: UNN/2026-rff_mp#176
2026-05-30 11:30:49 +00:00
00ff5134fc Merge pull request '[1]task1' (#290) from tseremonnikovaaa/2026-rff_mp:task1 into develop
Reviewed-on: UNN/2026-rff_mp#290
2026-05-30 11:30:16 +00:00
414db1c72f Merge pull request '[2] laba_2' (#328) from kalinovskiymi/2026-rff_mp:kalinovskiymi-laba-2 into develop
Reviewed-on: UNN/2026-rff_mp#328
2026-05-30 11:30:12 +00:00
a0b58a4489 Merge pull request '[1, 2]lab1, lab2' (#296) from filippovavm/2026-rff_mp:lab1 into develop
Reviewed-on: UNN/2026-rff_mp#296
2026-05-30 11:29:16 +00:00
0ea739636a Merge pull request '[1] Task 1 (Completed)' (#175) from zaharoves/2026-rff_mp:zadanie_1 into develop
Reviewed-on: UNN/2026-rff_mp#175
2026-05-30 11:29:10 +00:00
d801ac985c Merge pull request '[1,2] data-structures, maze' (#323) from osininyai/2026-rff_mp:osininyai into develop
Reviewed-on: UNN/2026-rff_mp#323
2026-05-30 11:28:46 +00:00
7e5d4cad71 Merge pull request '[2]Laba2' (#212) from komissarovgo/2026-rff_mp:komissarovgo2 into develop
Reviewed-on: UNN/2026-rff_mp#212
2026-05-30 11:27:36 +00:00
a8c94734c0 Merge pull request '[2] 2nd zadanie, otchet, benchmark & cool_pics' (#262) from kornevma/2026-rff_mp:kornevma_z2 into develop
Reviewed-on: UNN/2026-rff_mp#262
2026-05-30 11:27:27 +00:00
4efa5dcb85 Merge pull request '[1] лаба 1' (#229) from MochalovAE/2026-rff_mp:01 into develop
Reviewed-on: UNN/2026-rff_mp#229
2026-05-30 11:27:23 +00:00
05f56d5be3 Merge pull request '[1,2] data structures and maze solver' (#216) from raskatovia/2026-rff_mp:raskatovia-3 into develop
Reviewed-on: UNN/2026-rff_mp#216
2026-05-30 11:27:17 +00:00
e87bdd2808 Merge pull request '[1,2] 1 и 2 лабы' (#173) from musinaa/2026-rff_mp:task-1 into develop
Reviewed-on: UNN/2026-rff_mp#173
2026-05-30 11:26:01 +00:00
b6fd0051f9 Merge pull request '[1][2] lab1 structures and lab2 maze' (#214) from rybakovaa/2026-rff_mp:develop into develop
Reviewed-on: UNN/2026-rff_mp#214
2026-05-30 11:25:40 +00:00
77c6985b53 Merge pull request '[1] задание 1 с отчётом' (#261) from kornevma/2026-rff_mp:kornevma_z1 into develop
Reviewed-on: UNN/2026-rff_mp#261
2026-05-30 11:24:56 +00:00
75f807b85b Merge pull request '[1, 2] task 1 and task 2' (#160) from varavinvv/2026-rff_mp:varavinvv into develop
Reviewed-on: UNN/2026-rff_mp#160
2026-05-30 11:24:47 +00:00
8e0b2b71a2 Merge pull request '[2] lab2' (#264) from konnovaea/2026-rff_mp:lab2 into develop
Reviewed-on: UNN/2026-rff_mp#264
2026-05-30 11:24:46 +00:00
c2a40c8ce1 Merge pull request '[1, 2] ProninVV' (#242) from ProninVV/2026-rff_mp:ProninVV into develop
Reviewed-on: UNN/2026-rff_mp#242
2026-05-30 11:23:28 +00:00
44919e72ee Merge pull request '[1,2]newlaba2' (#304) from ivanchenkoam/2026-rff_mp:newlaba2 into develop
Reviewed-on: UNN/2026-rff_mp#304
2026-05-30 11:23:26 +00:00
cebf01f0d8 Merge pull request '[2] 2-nd-exercise FINAL FINAL' (#329) from lukovnikovde/2026-rff_mp:2-nd-exercise into develop
Reviewed-on: UNN/2026-rff_mp#329
2026-05-30 11:23:12 +00:00
8c12341e03 Merge pull request '[1][2] structure_data + maze' (#159) from IvantsovMA/2026-rff_mp:ivantsovma into develop
Reviewed-on: UNN/2026-rff_mp#159
2026-05-30 11:22:09 +00:00
0bda7aa621 Merge pull request '[2] 2-nd-exercise' (#268) from anikinvd/2026-rff_mp:2-nd-exercise into develop
Reviewed-on: UNN/2026-rff_mp#268
2026-05-30 11:22:03 +00:00
6068b06062 Merge pull request '[2]Lab-2' (#333) from soninrv/2026-rff_mp:soninrv_lab2 into develop
Reviewed-on: UNN/2026-rff_mp#333
2026-05-30 11:21:49 +00:00
b4154dafa7 Merge pull request '[1] firstex' (#340) from ZhuravlevDV/2026-rff_mp:ZhuravlevDV into develop
Reviewed-on: UNN/2026-rff_mp#340
2026-05-30 11:19:26 +00:00
d424eb9a23 Merge pull request '[1] strucktura_data' (#156) from simonovams/2026-rff_mp:SimonovaMS into develop
Reviewed-on: UNN/2026-rff_mp#156
2026-05-30 11:19:22 +00:00
a481877040 Merge pull request '[2] maze' (#332) from lomakinae/2026-rff_mp:maze into develop
Reviewed-on: UNN/2026-rff_mp#332
2026-05-30 11:16:23 +00:00
828eac11fa Merge pull request '[1,2] лаба 2 (тут еще и первая пусть будит)' (#319) from famutdinovmd/2026-rff_mp:master into develop
Reviewed-on: UNN/2026-rff_mp#319
2026-05-30 11:15:57 +00:00
be1af7bf6c Merge pull request '[12] test пуш' (#339) from shapovalovka/2026-rff_mp:ShapovalovKA into develop
Reviewed-on: UNN/2026-rff_mp#339
2026-05-30 11:15:16 +00:00
3b67462c48 Обновить README.md 2026-05-30 11:11:33 +00:00
452247bf09 Merge pull request '[2] Second exercise' (#360) from KuznetsovAS/2026-rff_mp:docs into develop
Reviewed-on: UNN/2026-rff_mp#360
2026-05-30 09:04:38 +00:00
e3c7c29712 [2] Second exercise 2026-05-30 12:03:21 +03:00
46bb2fde1e Merge pull request '[1] first exercise docs' (#359) from KuznetsovAS/2026-rff_mp:docs into develop
Reviewed-on: UNN/2026-rff_mp#359
2026-05-30 09:00:44 +00:00
b1060f2f73 First task' 2026-05-30 11:10:18 +03:00
89016b59a9 Обновить README.md 2026-05-30 08:06:16 +00:00
64fd540b45 refactor: move all my work into ivantsovma folder 2026-05-30 10:20:48 +03:00
af055d4e17 docs: add maze project report 2026-05-30 09:58:58 +03:00
8c2b455ca5 feat: add MazeProject (maze with patterns) to branch 2026-05-30 09:53:54 +03:00
49fa517565 [2] lab_2 finished and merged 2026-05-28 18:03:51 +03:00
19f9b5403c lab_2 graphics, doc finished 2026-05-28 17:54:18 +03:00
MariiaOs
3428678d8a [2] task2 2026-05-27 22:49:24 +03:00
bbd059e8b2 main full ver, graphics unfinished 2026-05-27 01:45:20 +03:00
2360b42a88 solver, observer and movement 2026-05-26 22:18:10 +03:00
fa4ec42cd2 Merge branch 'lab2' into develop 2026-05-26 15:21:55 +03:00
3f683b674e Добавил второе задание 2026-05-26 15:20:15 +03:00
d548b612e6 Добавил первое задание 2026-05-26 15:05:44 +03:00
73107e0565 Добавил номер группы 2026-05-26 14:47:29 +03:00
423acea089 2 задание 2026-05-25 21:17:56 +03:00
4a8728f3e0 add result.md and fix cod 2026-05-25 16:02:23 +03:00
951c90db20 [5] finally 2026-05-25 15:39:57 +03:00
cefff5de8d [0] initial commit 2026-05-25 15:33:15 +03:00
8ebd282344 task2 2026-05-25 15:23:54 +03:00
123
627e58a70e Обновлен отчет по Заданию 1 2026-05-25 14:04:45 +03:00
123
642874f0c2 [2] Собинина А. - Задание 2: лабиринт и паттерны GoF 2026-05-25 13:57:47 +03:00
18359cc7ad min BagFix 2026-05-25 13:46:44 +03:00
b1b22678a2 BagFix and add main file 2026-05-25 13:45:18 +03:00
0354fd9c79 добавлен диограмама в папку lab2_results 2026-05-25 13:20:57 +03:00
5a43e1610b добавлен файл отчета 2026-05-25 13:20:57 +03:00
1350cb60b3 Добавлен отчет из программы 2026-05-25 13:20:57 +03:00
e8e43b0919 finish2
исправлена ошибка в классе maze из-за которой код не запускался
2026-05-25 13:20:57 +03:00
287a6098b5 FINISH
добавлены функции для итерактивного подхода, для этого нужно запустить программу один раз и изменить желаемый лабиринт
2026-05-25 13:20:57 +03:00
dbd088daff experiment2
реализован запуск эксперимента с сохранением результатов в csv файле и png графиков в папке lab2_result
2026-05-25 13:20:57 +03:00
b091b98a93 experiments and new folder creation
реализовано создание папки для сохранения в ней результатов эксперимента, реализовано создание тестогово лабиринта
2026-05-25 13:20:57 +03:00
9ae55f1244 observer and command
реализованы классы визуализации и пошагового решения
2026-05-25 13:20:57 +03:00
80d51b3f93 stats
созданы классы оркестратора и сбора статистики
2026-05-25 13:20:57 +03:00
451ae4ce4b path finder
реализован паттерн Strategy для алгоритмов поиска пути
2026-05-25 13:20:57 +03:00
da8127d37a builder pattern
реализованы классы строющие лабиринты
2026-05-25 13:20:57 +03:00
20982d4172 maze model
реализованы классы симулирующую модель лабиринта
2026-05-25 13:20:57 +03:00
6db272487e classes
добавлены возможные необходимые классы в будущем
2026-05-25 13:20:57 +03:00
e14abb6194 Добавить novikovsd/maze.py 2026-05-25 13:20:57 +03:00
9a8a82a978 [4] 2-nd_ex 2026-05-25 13:10:22 +03:00
raskatovia
81ffeb0def [1,2] объединил задания в один запрос 2026-05-25 13:07:37 +03:00
6d17293486 [2] task2 2026-05-25 13:06:15 +03:00
e9ede2ecb3 [2] secondex 2026-05-25 13:03:14 +03:00
153f2a092c [2] 1-st_ex 2026-05-25 12:56:25 +03:00
057dfb01af [1] 1-st_ex 2026-05-25 12:46:31 +03:00
da3cf034d1 [1] firstex 2026-05-25 12:30:20 +03:00
shapovalovka
41004bcb8a [13] Final. All is complete 2026-05-25 11:58:51 +03:00
shapovalovka
83e323fff6 [12] test пуш 2026-05-25 11:55:27 +03:00
skorohodovsa
0822d2ac71 Merge branch 'main' of http://31.128.43.79:3000/SerKin0/2026-rff_mp
Синхронизация с удалённым репозиторием перед отправкой лабораторной работы.Merge branch 'main' of http://31.128.43.79:3000/SerKin0/2026-rff_mp
2026-05-25 11:31:33 +03:00
SerKin0
a88252fe56 Merge branch 'lab_1' 2026-05-25 11:28:06 +03:00
SerKin0
13315fd2c9 [1] to merge 2026-05-25 11:27:50 +03:00
ce521a257f [0] initial commit 2026-05-25 11:10:28 +03:00
SerKin0
cda95828a6 Merge branch 'binary_tree' into lab_1 2026-05-25 10:58:01 +03:00
SerKin0
f4666dae8b Merge branch 'linked_list' into lab_0
Merge branch 'linked_list' into lab_1

Добавлена реализация связного списка для лабораторной работы №1# the commit.
2026-05-25 10:56:18 +03:00
SerKin0
33c3f109fd [1] Добавлено binary_tree.py 2026-05-25 10:55:25 +03:00
SerKin0
1d4bd0bf73 [2] to merge 2026-05-25 10:23:00 +03:00
MarkinAM
e3bcc19952 [1,2] struck-data, maze_task 2026-05-25 09:57:30 +03:00
df3afe9dbf Task 2 2026-05-25 08:33:17 +03:00
886278c62f исправлена ошибка с невидимой точкой, поправлен вывод в консоли 2026-05-25 08:17:44 +03:00
5b0eb0874a сделал Command 2026-05-25 06:35:06 +03:00
dd698bad55 Observer 2026-05-25 04:50:25 +03:00
031b48653f бета-тест этапа MazeSolver 2026-05-25 04:06:25 +03:00
f3908409ce написаны MazeSolver, SearchStats 2026-05-25 03:52:35 +03:00
245a1e7c4b стратегии поиска пути 2026-05-25 03:30:40 +03:00
10dcc4307f added report 2026-05-25 03:26:25 +03:00
9c6804eea8 added results.csv 2026-05-25 03:17:42 +03:00
55ff0515e9 added plots 2026-05-25 03:14:54 +03:00
52cba853dd added mazes 2026-05-25 03:14:03 +03:00
7cbd75ee34 added main.py 2026-05-25 03:13:08 +03:00
oSTEVEo
b1a4e4185e Merge branch 'task-2' into task-1 2026-05-25 03:02:06 +03:00
oSTEVEo
3d9390a894 Рефакторинг всего и готовый отчёт 2026-05-25 03:00:00 +03:00
f7ce8e1682 бета-тест лабиринта (прошел успешно) 2026-05-25 02:58:42 +03:00
275f6b7297 отчет 2(дополнил) 2026-05-25 02:50:22 +03:00
12508587d6 docs: add report 2026-05-25 02:48:06 +03:00
f64679ead2 docs: add README 2026-05-25 02:48:06 +03:00
8460bf6405 feat: run benchmarks and generate results 2026-05-25 02:48:06 +03:00
59410050ca feat: add experiment benchmarks and Facade entry point 2026-05-25 02:48:06 +03:00
f16b87c034 feat: add text mazes for experiments 2026-05-25 02:47:33 +03:00
8ce584051b отчет 2 2026-05-25 02:42:13 +03:00
e6e4ae9a99 feat: add MazeSolver orchestrator with SearchStats 2026-05-25 02:34:56 +03:00
931e6a9ccf feat: add BFS, DFS, A* strategy implementations 2026-05-25 02:33:40 +03:00
e11bfb0f7a feat: add Builder pattern 2026-05-25 02:32:13 +03:00
38f361bdc4 feat: add Cell and Maze classes 2026-05-25 02:30:21 +03:00
434b63d633 builder 2026-05-25 02:27:34 +03:00
9f8e9e1384 [2] Убрана первая работа из ветки 2026-05-25 02:21:51 +03:00
cb04e571d3 [2] Отчёт 2026-05-25 02:03:27 +03:00
edbd5e15b8 [2] Законченная программа + Отчёт 2026-05-25 01:59:20 +03:00
23556d3900 [2] FINAL adding report for 2-nd LABA 2026-05-24 22:48:24 +00:00
e080be3fc1 [2] add png for prevant report lab 2 2026-05-24 22:44:24 +00:00
e0f27a4ef0 [2] add plots and csv data 2026-05-24 22:43:32 +00:00
72d33c2b84 [2] add maze no exit 2026-05-24 22:40:43 +00:00
16cd930cdd [2] add maze empty 2026-05-24 22:40:08 +00:00
5f5b14b739 [2] add maze20x20.txt 2026-05-24 22:39:22 +00:00
3035b7e15b [2] continu adding maze`s 2026-05-24 22:35:49 +00:00
8ba20c54b9 [2] start adding maze`s 2026-05-24 22:35:08 +00:00
cb5e43f857 [2] experimental module and plotting 2026-05-24 22:33:48 +00:00
641e1a8aac [2] feet rewrite some classes and add some coments 2026-05-24 22:32:17 +00:00
dfd34a3974 [2] add player rejim 2026-05-24 22:29:17 +00:00
539dba32f9 [2] realising BFS DFS and A* 2026-05-24 22:27:40 +00:00
4e1fab741f [2] starting lab 2 2026-05-24 22:25:57 +00:00
d5d4c702b5 [2] Finishing prepare to 2-nd exercise 2026-05-24 22:21:26 +00:00
3bef169aba Загрузить файлы в «lukovnikovde/docs/data/1-st-exercise» 2026-05-24 22:20:55 +00:00
1eb2b4da53 Удалить lukovnikovde/docs/data/time_schedule.png 2026-05-24 22:20:45 +00:00
a5c368e145 [2] preparing rep to 2-nd exercise 2026-05-24 22:20:31 +00:00
7aca816d85 [2] preparing rep to 2-nd exercise 2026-05-24 22:20:10 +00:00
979fcfa452 Загрузить файлы в «kalinovskiymi/docs_2/data_2» 2026-05-24 22:17:52 +00:00
7e0a54a817 Загрузить файлы в «kalinovskiymi/docs_2/data_2» 2026-05-24 22:17:33 +00:00
4f7e692ab3 Загрузить файлы в «kalinovskiymi/docs_2» 2026-05-24 22:16:36 +00:00
5abb175441 Удалить kalinovskiymi/otchet_2.md 2026-05-24 22:16:07 +00:00
068a5f0590 Загрузить файлы в «kalinovskiymi» 2026-05-24 22:15:33 +00:00
7e53aebb10 Загрузить файлы в «dyachenkoas/docs/data» 2026-05-24 22:15:12 +00:00
564db4d839 _ 2026-05-25 01:15:01 +03:00
78513d3506 Загрузить файлы в «dyachenkoas/docs» 2026-05-24 22:14:49 +00:00
80b33d9f61 Удалить kalinovskiymi/otchet_1.md 2026-05-24 22:14:41 +00:00
80381f6b5d Удалить dyachenkoas/docs/benchmark_results.csv 2026-05-24 22:14:18 +00:00
ff14e2635a Удалить dyachenkoas/docs/benchmark_graph.png 2026-05-24 22:14:13 +00:00
54418fac12 Удалить dyachenkoas/docs/1laba.py 2026-05-24 22:14:09 +00:00
60c6452b4a Удалить dyachenkoas/otchet_laba_1.md 2026-05-24 22:13:33 +00:00
c628f43dbe [2] maze 2026-05-25 01:12:26 +03:00
7e723606cb lab_2 Astar 2026-05-25 01:11:16 +03:00
feb001df7c Загрузить файлы в «dyachenkoas/docs» 2026-05-24 22:07:41 +00:00
a9deaa51ec added report 2026-05-25 01:06:00 +03:00
ed33210af4 очистил папку docs 2026-05-25 01:05:37 +03:00
9dcaef45ec [1] laba1
[1] Лабораторная работа 1
2026-05-24 22:04:11 +00:00
482048fc8a Merge pull request '[1] laba_1' (#1) from kalinovskiymi-laba-1 into kalinovskiymi
Reviewed-on: kalinovskiymi/2026-rff_mp#1
2026-05-24 22:03:09 +00:00
0ce55669c3 [1] laba_1
[1] лабораторная работа 1
2026-05-24 22:01:35 +00:00
51f77e7a5a added plots 2026-05-25 01:00:45 +03:00
86dfd72c42 Удалить dyachenkoas/docs/data2/maze_small.txt 2026-05-24 21:57:23 +00:00
24ec288ee8 Удалить dyachenkoas/docs/data2/maze_no_exit.txt 2026-05-24 21:57:19 +00:00
b223ce3e2e Удалить dyachenkoas/docs/data2/maze_medium.txt 2026-05-24 21:57:13 +00:00
dff3e7f934 Удалить dyachenkoas/docs/data2/maze_large.txt 2026-05-24 21:57:08 +00:00
d8972df779 Удалить dyachenkoas/docs/data2/maze_empty.txt 2026-05-24 21:57:04 +00:00
07e5f05661 Удалить dyachenkoas/docs/data/otchet_laba_1.md 2026-05-24 21:56:57 +00:00
a9ee9e60f2 Удалить dyachenkoas/docs/data/benchmark_results.csv 2026-05-24 21:56:52 +00:00
13a81dbc33 Удалить dyachenkoas/docs/data/benchmark_graph.png 2026-05-24 21:56:48 +00:00
1440f8a4b6 Удалить dyachenkoas/docs/data/1laba.py 2026-05-24 21:56:37 +00:00
2f896f1f87 Удалить kalinovskiymi/docs/data_2/Без_выхода_50x50.txt 2026-05-24 21:56:27 +00:00
326c84c3f0 Удалить kalinovskiymi/docs/data_2/task_2_2.py 2026-05-24 21:56:24 +00:00
04a49325d3 Удалить dyachenkoas/docs/otchet_laba_2.md 2026-05-24 21:56:23 +00:00
e475853175 Удалить kalinovskiymi/docs/data_2/results.csv 2026-05-24 21:56:21 +00:00
52a4b077fa Удалить dyachenkoas/docs/otchet_laba_1.md 2026-05-24 21:56:18 +00:00
6a0209fb6b Удалить kalinovskiymi/docs/data_2/mazes_visualization.png 2026-05-24 21:56:17 +00:00
1949ccff77 Удалить kalinovskiymi/docs/data_2/comparative_results.png 2026-05-24 21:56:13 +00:00
e5dd2683e9 Удалить kalinovskiymi/docs/otchet_2.md 2026-05-24 21:56:05 +00:00
2769e3eb01 Удалить kalinovskiymi/docs/otchet_1.md 2026-05-24 21:55:59 +00:00
8f6c31904c revert 1c5c49cd0d
revert Удалить dyachenkoas/docs/data/otchet_laba_1.md
2026-05-24 21:55:53 +00:00
cb4a60d325 revert 61f50cedde
revert revert 0415405f0d

revert revert d3e6a241b2

revert Загрузить файлы в «kalinovskiymi/docs/data_2»
2026-05-24 21:55:46 +00:00
541d73abd2 revert 61f50cedde
revert revert 0415405f0d

revert revert d3e6a241b2

revert Загрузить файлы в «kalinovskiymi/docs/data_2»
2026-05-24 21:55:20 +00:00
d5b077f8dd added results.csv 2026-05-25 00:55:18 +03:00
61f50cedde revert 0415405f0d
revert revert d3e6a241b2

revert Загрузить файлы в «kalinovskiymi/docs/data_2»
2026-05-24 21:55:09 +00:00
6e7f88a63c revert 4633efddae
revert Загрузить файлы в «kalinovskiymi/docs/data»
2026-05-24 21:54:53 +00:00
315b554b85 revert 9ef6acffb0
revert Загрузить файлы в «dyachenkoas/docs/data2»
2026-05-24 21:54:41 +00:00
0415405f0d revert d3e6a241b2
revert Загрузить файлы в «kalinovskiymi/docs/data_2»
2026-05-24 21:53:18 +00:00
befe3ecf93 [3] 2-st exersize 2026-05-25 00:52:58 +03:00
1ee21603e5 очистка второй ветки 2026-05-25 00:52:52 +03:00
bf2dc50479 added experiment 2026-05-25 00:51:26 +03:00
SolovevDD
feaa05f32d [3] 2-nd exersize and report 2026-05-25 00:45:55 +03:00
77485a5318 implemented bst 2026-05-25 00:44:07 +03:00
fb36061d9a implemented hash table 2026-05-25 00:42:24 +03:00
4f8b4e8a49 task 1 2026-05-25 00:41:50 +03:00
9ff0e6aa20 [2]task2 2026-05-25 00:40:49 +03:00
c7e471c87a _ 2026-05-25 00:38:49 +03:00
72d2269634 implemented linked list 2026-05-25 00:36:56 +03:00
d25d91e54d [1] add report for 1-st laba 2026-05-24 21:26:28 +00:00
58ca1450e3 [1] add png to report 2026-05-24 21:25:39 +00:00
d47b06ae6f [1] add csv results and png plots 2026-05-24 21:24:27 +00:00
74c13ec0fb [1] add performance experiments and plotting 2026-05-24 21:16:18 +00:00
319171fe2c [1] implement binary search tree 2026-05-24 21:14:28 +00:00
0c2e487472 [1] add hash table implementation 2026-05-24 21:13:07 +00:00
a703898619 Main 2026-05-25 00:12:23 +03:00
e464e4e1e0 [1] add main.py 2026-05-24 21:11:54 +00:00
e741fab112 Построение графиков 2026-05-25 00:09:29 +03:00
05980b5e12 Update semyanovra/docs/data/2-nd/maze/no_exit10x10.txt 2026-05-24 21:08:10 +00:00
350ccb861e Update semyanovra/docs/data/2-nd/maze/medium10x10.txt 2026-05-24 21:07:39 +00:00
766b3facf2 Update semyanovra/docs/data/2-nd/maze/large20x20.txt 2026-05-24 21:07:07 +00:00
bebedf835e Update semyanovra/docs/data/2-nd/maze/level1.txt 2026-05-24 21:06:45 +00:00
ee9aedf359 Update semyanovra/docs/data/2-nd/maze/empty15x15.txt 2026-05-24 21:06:16 +00:00
b9a3497b5a Update semyanovra/docs/data/2-nd/mazelarge20x20.txt 2026-05-24 21:05:44 +00:00
86190175eb Update semyanovra/docs/data/maze/large20x20.txt 2026-05-24 21:05:20 +00:00
07dc80bee2 Генерация данных и замер времени 2026-05-25 00:05:01 +03:00
29a062508f Update semyanovra/docs/data/maze/empty15x15.txt 2026-05-24 21:04:57 +00:00
f48e920dd1 [2] update structure of repo 2026-05-24 21:04:12 +00:00
536c36b9fb Delete semyanovra/scr/generate_data.py 2026-05-24 21:03:05 +00:00
35ab0b7347 Delete semyanovra/docs/experiment_setup.md 2026-05-24 21:02:52 +00:00
e435c7fcc1 Двоичное дерево 2026-05-24 23:59:11 +03:00
c586553b8b отчет и график 2026-05-24 23:58:00 +03:00
61908239da result 2026-05-24 23:53:59 +03:00
41433c287a Хеш-таблица 2026-05-24 23:44:10 +03:00
43ea04de23 Лабораторная работа №2 2026-05-24 23:39:14 +03:00
a95db6edf3 поправлен вывод значений 2026-05-24 23:28:20 +03:00
7e124d2f50 [2] add report for 2-nd lab 2026-05-24 20:22:01 +00:00
3cba71c6e7 Связный список 2.0(прошлый был тестовый) 2026-05-24 23:21:43 +03:00
4382efbe09 Upload files to "BoriskovaDV/docs" 2026-05-24 20:21:03 +00:00
f1b42d1c24 Upload files to "BoriskovaDV/docs/data/2-nd-exercise" 2026-05-24 20:20:26 +00:00
66a16fb3a1 [2] feet: add blocked exit in no exit maze 2026-05-24 20:18:19 +00:00
f776455086 [2] add maze_no_exit.txt 2026-05-24 20:16:07 +00:00
71b3fecbcf [2] add maze_empty.txt 2026-05-24 20:15:41 +00:00
9e04d5930e [2] add maze20x20.txt 2026-05-24 20:15:05 +00:00
7cb73be269 [2] add maze10x10.txt 2026-05-24 20:14:39 +00:00
476ca1451e [2] add maze1.txt 2026-05-24 20:14:09 +00:00
e053d90c29 [2] generate performance plots from experimental data 2026-05-24 20:13:40 +00:00
fab92c6734 [2] add interactive player controls and undo feature 2026-05-24 20:12:05 +00:00
3dc7e19f49 [2] implement maze solver with statistics collection 2026-05-24 20:09:48 +00:00
43ca559493 [2] add pathfinding algorithms 2026-05-24 20:07:50 +00:00
d3e6a241b2 Загрузить файлы в «kalinovskiymi/docs/data_2» 2026-05-24 20:05:56 +00:00
8f8ae504e3 Загрузить файлы в «kalinovskiymi/docs/data_2» 2026-05-24 20:05:03 +00:00
9cd3c9caf5 [2] add main.py 2026-05-24 20:01:11 +00:00
97dbb34c10 Загрузить файлы в «kalinovskiymi/docs» 2026-05-24 19:58:55 +00:00
b6fd8ae06f clean 2026-05-24 22:55:51 +03:00
e0b142c994 [1] add report for lab1 2026-05-24 19:53:07 +00:00
e3f4f4c57f [1] add plots and csv results 2026-05-24 19:52:19 +00:00
79dc0854a1 Upload files to "BoriskovaDV/docs" 2026-05-24 19:51:53 +00:00
a32ff24a11 Merge branch 'nikolaevda' of http://31.128.43.79:3000/nikolaevda/2026-rff_mp into nikolaevda 2026-05-24 22:20:16 +03:00
797c260aaa observer_command 2026-05-24 22:18:38 +03:00
3d7c072106 lab_2 builder, BFS, DFS 2026-05-24 22:12:39 +03:00
9800ba7078 [1] исправлено проведение замеров и отчет 2026-05-24 21:51:14 +03:00
1b31955e9c [2] task2 2026-05-24 21:49:38 +03:00
e6c58ac054 [2] task2 2026-05-24 21:48:59 +03:00
kirill
653af1f2f6 results and report 2026-05-24 21:34:23 +03:00
kirill
f26da8a6cc main.py added 2026-05-24 21:32:03 +03:00
kirill
3c644d29b0 maze.py added 2026-05-24 21:31:36 +03:00
kirill
efd614bd23 maze_generator added 2026-05-24 21:31:01 +03:00
443ec394f0 Доп.проверка 2026-05-24 21:11:54 +03:00
9ef6acffb0 Загрузить файлы в «dyachenkoas/docs/data2» 2026-05-24 18:11:24 +00:00
768c8e64f2 [2]for zadanie 2 2026-05-24 21:11:08 +03:00
8353478190 Загрузить файлы в «dyachenkoas/docs/data2» 2026-05-24 18:10:28 +00:00
20a235975f Загрузить файлы в «dyachenkoas/docs» 2026-05-24 18:08:19 +00:00
5597f8a8a7 [1] add plot_results.py 2026-05-24 18:02:07 +00:00
bde87a177b [1] add experiment.py 2026-05-24 18:01:39 +00:00
b7d5bf54dd [1] add bst_phonebook.py 2026-05-24 18:01:03 +00:00
516ac2e1fb таблица результатов 2026-05-24 20:51:39 +03:00
df10b20f41 файл для графика 2026-05-24 20:50:09 +03:00
380b683b37 [2] for 2-nd ex 2026-05-24 20:48:03 +03:00
f7b3ae0878 Код и отч\т для лабиринта 2026-05-24 20:46:25 +03:00
7371fb231a Merge branch 'ZelentsovAV-task2' into ZelentsovAV 2026-05-24 20:43:57 +03:00
7e01d972c1 Проверка (успех) 2026-05-24 20:40:20 +03:00
8963a00e6e доделана эксперементальная часть 2026-05-24 20:38:56 +03:00
089cd9ac58 laba 2 2026-05-24 20:33:47 +03:00
e27b2772db [1] add hash_tabel 2026-05-24 17:31:57 +00:00
c967240036 [1] start 1-st-exercise 2026-05-24 17:31:03 +00:00
dd03fdd059 [0] refork repo(I`m sorry) 2026-05-24 17:30:04 +00:00
aadb5b2e3b Основная функция main 2026-05-24 20:24:56 +03:00
118945f625 Анализ эффективности алгоритмов 2026-05-24 20:20:06 +03:00
c708d708e3 1 laba 2026-05-24 20:18:54 +03:00
7eb2e40099 Экспериментальная часть 2026-05-24 20:15:48 +03:00
8aa0d0ee0e Паттерн Command (пошаговое движение с отменой) 2026-05-24 20:14:31 +03:00
49ef151e63 Паттерн Observer 2026-05-24 20:12:46 +03:00
9f5a0055f3 Оркестратор MazeSolver и статистика 2026-05-24 20:10:49 +03:00
4c14b6d0b3 Паттерн Strategy 2026-05-24 20:09:28 +03:00
d8943615fa [2] папка с лабой 2 2026-05-24 20:08:34 +03:00
6491d3a79e Подготовка 2026-05-24 20:07:26 +03:00
4633efddae Загрузить файлы в «kalinovskiymi/docs/data» 2026-05-24 17:04:17 +00:00
f4a032747b Загрузить файлы в «kalinovskiymi/docs» 2026-05-24 17:02:50 +00:00
cd5b180383 [2] папка с лабой 2 2026-05-24 19:45:02 +03:00
d576fe4a6b Задание 2 2026-05-24 19:39:37 +03:00
02842819e9 Библиотеки и базовые классы Cell и Maze 2026-05-24 19:28:32 +03:00
9395b9807c Тестирование программы (успех) 2026-05-24 19:17:11 +03:00
9a6cf10396 [2] папка с лабой2 и отчетом 2026-05-24 19:16:18 +03:00
oSTEVEo
9849075a38 Реализован класс-оркестратор для тестирования 2026-05-24 19:12:04 +03:00
82cb313306 Загрузить файлы в «YaroslavtsevAS/docs» 2026-05-24 15:51:37 +00:00
31270e0ffd [2] add report to lab2 2026-05-24 15:51:16 +00:00
975ffb8a54 Добавить YaroslavtsevAS/docs/ReportLab2 2026-05-24 15:50:50 +00:00
bbd26d8f8d Удалить YaroslavtsevAS/docs/2-nd-lab/maze/1 2026-05-24 15:49:46 +00:00
da1a8356e7 Загрузить файлы в «YaroslavtsevAS/docs/2-nd-lab» 2026-05-24 15:48:56 +00:00
07523b3617 [2] add maze`s 2026-05-24 15:48:37 +00:00
0e4684b897 Добавить YaroslavtsevAS/docs/2-nd-lab/maze/1 2026-05-24 15:48:05 +00:00
2a4a8114a7 Удалить YaroslavtsevAS/docs/2-nd-lab/maze 2026-05-24 15:47:53 +00:00
7aca3961e3 [2] add maze directory 2026-05-24 15:47:42 +00:00
aae08b7336 [2] Final add some coments and rewrite some defs 2026-05-24 15:37:16 +00:00
11d65436e1 [2] add experimenal and plots 2026-05-24 15:34:48 +00:00
fc6b64b7cd [2] add A* 2026-05-24 15:34:20 +00:00
1dcc56d0bc [2] add BFS and DFS 2026-05-24 15:33:58 +00:00
3032b5283b [2] start lab2 and add main.py 2026-05-24 15:32:34 +00:00
68d1dfa68e [1]laba 1 2026-05-24 18:27:35 +03:00
07e7eaa7ee [lab2] лабиринт: полное решение с отчётом и графиками 2026-05-24 15:27:15 +00:00
163eb1010f [2] add report 2026-05-24 15:10:38 +00:00
1a9317dad7 [2] add experimental data 2026-05-24 15:06:38 +00:00
d4aa0588c3 [2] add maze no exit maze 2026-05-24 15:02:58 +00:00
3773442642 [2] add maze_empty 2026-05-24 15:01:34 +00:00
af06031de7 [2] add maze20x20 2026-05-24 15:01:06 +00:00
22a395ad0a [2] add 10x10 maze 2026-05-24 15:00:34 +00:00
SerKin0
27c2f99467 [2] Добавление этапа 5 2026-05-24 18:00:14 +03:00
bbdb44dd88 [2] add maze1 2026-05-24 15:00:00 +00:00
SerKin0
86b31473f3 [2] Изменение положения функций _find_start() и _find_exit() из PathFindingStrategy в функционал класса Maze 2026-05-24 17:58:56 +03:00
82943137b3 [2] feat - эксперименты и построение графиков 2026-05-24 14:58:06 +00:00
bca3eb1b7c [2] feat - полноценный игровой цикл и интеграция алгоритмов 2026-05-24 14:56:28 +00:00
b29a0309a1 [2] feat - игрок и система команд с Undo 2026-05-24 14:55:50 +00:00
2e68f1a389 [2] feat - Observer и консольная визуализация 2026-05-24 14:54:57 +00:00
59a488fec2 [2] Исправил код 1,3 доделал 2026-05-24 17:45:37 +03:00
4bc13373b1 [5] добавлены графики 2026-05-24 14:43:21 +00:00
d3e3962dd8 добавлены ответы в новой ветке lab1 2026-05-24 14:41:07 +00:00
SerKin0
f393ad5203 [2] Добавление тестовых лабиринтов 2026-05-24 17:33:35 +03:00
4ae10433ff Добавлен текстовый файл 2026-05-24 17:30:55 +03:00
7f4c49e5fc Merge branch 'develop' into ShulpinIN 2026-05-24 14:28:48 +00:00
04657980e7 добавлен код и лабиринты для лабораторной работы №2 2026-05-24 17:22:46 +03:00
37528912c7 добавлен код и лабиринты для лабораторной работы №2 2026-05-24 17:22:17 +03:00
7164968879 Загрузить файлы в «groshevava/docs/data» 2026-05-24 14:19:05 +00:00
95b152b17c Загрузить файлы в «groshevava/docs/data» 2026-05-24 14:18:14 +00:00
SerKin0
5378824649 [2] Обновление документации:
- Добавлены разделы про алгоритмы
2026-05-24 17:17:48 +03:00
47566646d9 [4] исправлен отчёт 2026-05-24 14:17:21 +00:00
SerKin0
f7577f803c [2] Добавлено:
- Тесты на классы Cell, Maze
- Алгоритмы поиска пути: BFS, DFS, Astar
2026-05-24 17:17:02 +03:00
5b3441628a Загрузить файлы в «groshevava/docs/data» 2026-05-24 14:16:51 +00:00
89e9ab282a Загрузить файлы в «groshevava/docs» 2026-05-24 14:12:45 +00:00
08255c2e97 [3] добавлены результаты 2026-05-24 14:10:51 +00:00
a966076c00 [2] feat - оркестратор MazeSolver и статистика 2026-05-24 14:08:34 +00:00
acbd3a3892 [2] feat - три алгоритма поиска пути (BFS, DFS, A*) 2026-05-24 14:07:25 +00:00
1b07ec908d [1] Обновлён отчёт (исправления/дополнения) 2026-05-24 17:06:46 +03:00
735626045b [2] feat - загрузка лабиринта из файла 2026-05-24 14:06:39 +00:00
4139af5eae [2] добавлен main.py 2026-05-24 14:06:09 +00:00
56ff7f317a [2] init 2026-05-24 14:06:06 +00:00
1921a993c9 [1] добавлена структура 2026-05-24 17:02:19 +03:00
d3f918f9be [1] Добавлен отчёт 2026-05-24 17:00:21 +03:00
31726394a9 добавлены файлы отчетов 2026-05-24 16:47:28 +03:00
e677d750f7 FINISH 2
исправлены ошибки в написании, которые мешали запуску кода
2026-05-24 13:43:41 +00:00
52a5aa8fc6 FINISH
создана функция, проводящая замеры, функция сохраняющая замеры
2026-05-24 13:34:12 +00:00
859ee847dd mes func
созданы измерительные функции для каждого типа данных
2026-05-24 13:29:20 +00:00
a740a6cb6b data def
создана функция, создающая тестовый набор записей
2026-05-24 13:26:04 +00:00
9d935dc1f9 bin tree
реализовано двоичное дерево с помощью функций вставки/обновления, возвращения корня, итеративного поиска, поиска узла с минимальным ключем, рекурсивного удаления, центрированного обхода
2026-05-24 13:24:43 +00:00
132e7e049b hash
реализована хэш таблица, с помощью функций отсартировки, удаления, поиска, вставки/обновления. добавлена глубина рекурсиидля bst удаления
2026-05-24 13:21:49 +00:00
706e7b5e7f created linked list
созданы функции добавления, удаления, изменения и ввода даынных для связонного списка
2026-05-24 13:18:52 +00:00
926c13b163 Загрузить файлы в «dyachenkoas/docs» 2026-05-24 13:01:25 +00:00
a9270288ba Удалить dyachenkoas/docs/otchet_laba_1.md 2026-05-24 12:59:58 +00:00
1c5c49cd0d Удалить dyachenkoas/docs/data/otchet_laba_1.md 2026-05-24 12:59:24 +00:00
d19b1788cf revert 901031fd0a
revert revert 6bed72c0f5

revert Загрузить файлы в «dyachenkoas/docs/data»
2026-05-24 12:58:21 +00:00
a358963ffc Загрузить файлы в «dyachenkoas/docs» 2026-05-24 12:56:08 +00:00
901031fd0a revert 6bed72c0f5
revert Загрузить файлы в «dyachenkoas/docs/data»
2026-05-24 12:55:32 +00:00
58ab8d9227 create py file 2026-05-24 15:54:21 +03:00
6bed72c0f5 Загрузить файлы в «dyachenkoas/docs/data» 2026-05-24 12:53:03 +00:00
95f6d90af3 задание 1 2026-05-24 15:41:51 +03:00
b908d49a10 revert c254158275
revert [1] lab1 clean

[1] lab1 clean
2026-05-24 12:26:53 +00:00
588e654462 [2] добавил 2 программы 2026-05-24 15:21:41 +03:00
c254158275 [1] lab1 clean
[1] lab1 clean
2026-05-24 12:20:42 +00:00
123
4144c3d390 [1] Собинина А. - Задание 1: структуры данных 2026-05-24 15:13:13 +03:00
22acd557d1 Добавлен код и отчет по лабораторной работе №1 "Структуры данных" 2026-05-24 14:16:21 +03:00
579df4fff2 [2] добавлен отчет, демо программа и __init__.py для пакетов 2026-05-24 13:35:08 +03:00
39db199b6e [2] initial commit 2026-05-24 13:09:54 +03:00
05c3a5cb6c [2] initial commit 2026-05-24 13:08:02 +03:00
f79bddbef7 Удалить .idea/2026-rff_mp_ViniuchukAN.iml 2026-05-24 08:58:50 +00:00
6a4e82001c Удалить .idea/.gitignore 2026-05-24 08:58:04 +00:00
fa78ae9472 [2] добавлены результаты экспериментов и графики 2026-05-24 11:42:40 +03:00
ddcf9d2c34 [2] maze solver 2026-05-24 11:40:51 +03:00
4ce7536bbf [2] добавлен скрипт для сравнения алгоритмов 2026-05-24 11:30:30 +03:00
d8ae32af35 Добавление чистой папки второй лабораторной рабты 2026-05-24 11:12:33 +03:00
d59cd16706 [2] добавлены MazeSolver, паттерны Observer и Command 2026-05-24 01:55:48 +03:00
77c787c2f4 написана тестовая генерация, вроде работает) 2026-05-24 01:41:52 +03:00
oSTEVEo
983ef65bef Закончен этап 5. Паттерн Command будет реализован позже 2026-05-24 00:45:43 +03:00
oSTEVEo
95805467ab Реализован паттерн Observer 2026-05-24 00:33:24 +03:00
29f33fa407 сделана структура дерева 2026-05-24 00:22:14 +03:00
4427e6d0a1 [2] Генерация лабиринтов 2026-05-23 23:02:53 +03:00
0c93c3a3b0 [2] Добавлен паттерн Strategy с алгоритмами поиска пути (BFS, DFS, A*, Дейкстра) 2026-05-23 22:47:48 +03:00
70f49bb8c5 Merge branch 'task-2' into task-1 2026-05-23 22:35:49 +03:00
1c1d20e017 [1]for zadanie 1 2026-05-23 22:13:53 +03:00
140a03b1a1 [1]for 1 zadanie 2026-05-23 21:52:19 +03:00
4db9491cec [2] добавлены модель лабиринта и паттерн Builder 2026-05-23 21:33:40 +03:00
a50bd41ccf Добавил код задания 1, отчёт и результаты замеров 2026-05-23 21:31:27 +03:00
c3fb6c4bd9 Добавил код задания 1, отчёт и результаты замеров 2026-05-23 21:15:35 +03:00
396b19bf71 [1] initial commit 2026-05-23 20:54:44 +03:00
268d492389 Task 1 2026-05-23 20:14:56 +03:00
7e0ac65b64 отчет и мемчик 2026-05-23 20:02:39 +03:00
9c066a3e03 5 этап 2026-05-23 19:51:32 +03:00
23012e3e84 4 этап 2026-05-23 19:49:44 +03:00
c5baf3661a добавлены функции ht_find ht_delete ht_list_ all 2026-05-23 19:49:23 +03:00
04e7b32684 3 этап 2026-05-23 19:48:29 +03:00
86f4936e0e 2 этап 2026-05-23 19:39:52 +03:00
63e6158583 Merge branch 'SolovevDS-task2' into SolovevDS-task1 2026-05-23 19:38:43 +03:00
03eb347e0d 1 этап 2026-05-23 19:34:11 +03:00
759c0eab91 вычисление индекса, начало хеш таблицы 2026-05-23 19:22:09 +03:00
e8418bd446 2th task is absolutly completed 2026-05-23 19:21:14 +03:00
5f7e7cec65 Завершение отчёта 2026-05-23 18:42:57 +03:00
e1d3f90053 [0] начало работы над 2-ым заданием 2026-05-23 18:34:05 +03:00
6fc7a657d2 [1] отчет по лабе 1 2026-05-23 17:17:23 +03:00
07effa49c2 [1] графики 2026-05-23 17:01:57 +03:00
834bc5e7b0 Создание графиков, начало написания отчёта 2026-05-23 16:47:29 +03:00
610bef7926 [1] csv 2026-05-23 16:46:58 +03:00
5343261de3 [1] генерация и замер времени 2026-05-23 16:35:05 +03:00
238245c512 Конфликт слияния 2026-05-23 16:31:09 +03:00
SerKin0
535c706af8 [2] Добавление docstring к Cell, Maze
Добавлен интерфейс для алгоритмов
2026-05-23 16:30:04 +03:00
7fafaba9eb [1] бст 2026-05-23 16:27:41 +03:00
f589771843 сделал явную сортировку и исправил недочеты 2026-05-23 16:12:52 +03:00
673c18cfaf [1] хэш-таблица 2026-05-23 16:07:41 +03:00
744a44c5bc Добавил код задания 1, отчёт и результаты замеров 2026-05-23 15:58:18 +03:00
054035deac [1] реализация связного списка 2026-05-23 15:52:49 +03:00
c30410f5b0 [1] библиотеки 2026-05-23 15:39:39 +03:00
1aacdc4e26 [1] добиваил файл для кода 2026-05-23 15:03:26 +03:00
60b42ee51c закончил связный список 2026-05-23 14:47:03 +03:00
bb11731efd сделан лабиринт и подправлен первй отчет 2026-05-23 13:50:28 +03:00
afa3c146b0 micro bag fix 2026-05-23 13:37:43 +03:00
21985795a1 [1] добавил функцию ll_insert 2026-05-23 13:23:41 +03:00
raskatovia
65594bdb6e [2] оформил отчет 2026-05-23 12:34:31 +03:00
raskatovia
5b68540615 [2] сделал замеры алгоритмов 2026-05-23 12:14:08 +03:00
raskatovia
c19eb1a1f6 [2] добавил тестовые лабиринты 2026-05-23 12:11:53 +03:00
oSTEVEo
74928a997a Реализован Этап 5 2026-05-23 12:02:30 +03:00
31f166f293 add Mazes 2026-05-23 11:42:39 +03:00
7782d2e812 Добавлены все лабиринты
- Добавил все лабиринты и проверил корректность работы
- очистил выходные данные ipynb файлов
2026-05-23 01:22:42 +03:00
59b6e40e4a mini fix 2026-05-23 01:06:48 +03:00
762517d624 Реализация тестирования
- Написал логику тестирования алгоритмов
- добавил заглушки лабиринтов
- реализовал сохранение результатов
- пока оставил файл тесторивания в корне проекта
2026-05-23 01:01:08 +03:00
e63c31a3e3 add pre-test(benchmark) funktion 2026-05-23 00:45:19 +03:00
056c905032 add Observer and Command 2026-05-23 00:24:16 +03:00
bd2c4fd939 [1]итог 2026-05-23 00:17:04 +03:00
5dc9777c5a stage 5.2 has been completed 2026-05-23 00:04:45 +03:00
29495a0eda add MazeSolver 2026-05-22 23:58:06 +03:00
52896e6f1d Связный список 2026-05-22 23:41:23 +03:00
d04a7c0c47 add all strategy 2026-05-22 23:34:48 +03:00
69095c1b52 Запуск программы 2026-05-22 23:17:59 +03:00
8116c3836d Добавлен отчет 2026-05-22 23:16:02 +03:00
SerKin0
de1170df68 [2] Добавлен раздел про наименование файлов тестов-лабиринтов 2026-05-22 23:12:50 +03:00
b652b1515c Основная функция main() 2026-05-22 23:11:58 +03:00
SerKin0
7a84310d5d [2]
- Перемещение models в папку source
- Добавление обращения к Maze как к двумерному списку
2026-05-22 23:11:46 +03:00
a8baea68c7 Функции построения графиков 2026-05-22 23:07:21 +03:00
27417decc0 Генерация данных и функции замеров 2026-05-22 23:01:54 +03:00
da179c5dde Двоичное дерево поиска 2026-05-22 23:00:35 +03:00
951190aa68 Хеш-таблица 2026-05-22 22:59:13 +03:00
062a96a0b4 [2] Добавлены наблюдатель и команда 2026-05-22 22:40:41 +03:00
ef877978d2 Реализация алгоритма A* 2026-05-22 22:27:49 +03:00
e54b6c0a7e исправление метода name 2026-05-22 22:10:16 +03:00
07fe035d63 Связный список 2026-05-22 22:08:31 +03:00
1224a5afee Реализация алгоритма Дейкстры 2026-05-22 21:57:45 +03:00
raskatovia
fa3d95b5c0 [2] добавил поиск astar 2026-05-22 21:44:40 +03:00
raskatovia
f3270c4197 [2] проверил запуск разных стратегий 2026-05-22 21:39:47 +03:00
raskatovia
a339b8fb6f [2] добавил поиск в глубину 2026-05-22 21:34:27 +03:00
156aa5d75d fix: restore README.md from develop branch 2026-05-22 21:28:38 +03:00
1edbb037d0 stage 4 has been completed 2026-05-22 21:28:16 +03:00
raskatovia
308ee2d716 [2] добавил поиск в ширину 2026-05-22 21:26:10 +03:00
raskatovia
a912487cdc [2] добавил модель лабиринта 2026-05-22 21:24:59 +03:00
raskatovia
c1086c89c3 [2] начал работу с лабиринтом 2026-05-22 21:11:03 +03:00
d452965a3b [2] Add cartinka s grafikami 2026-05-22 18:08:57 +00:00
940d38fba5 [2] Add report 2026-05-22 18:08:33 +00:00
75fcff26d9 [2] Add correctly data 2026-05-22 18:07:29 +00:00
181ce4b3f1 [2] Wrong data 2026-05-22 18:07:10 +00:00
241f2a0211 [2] Add experimental data 2026-05-22 18:05:48 +00:00
d509d14862 [2] Add mazes 2026-05-22 18:03:13 +00:00
b335daa881 [2] Add plots generator 2026-05-22 18:01:05 +00:00
1bb67bff28 [2] Add main.py and start 2-nd-exxercise 2026-05-22 18:00:00 +00:00
f66f706883 Загрузить файлы в «anikinvd/docs» 2026-05-22 17:56:04 +00:00
98874a9f79 [1] Add csv file with results 2026-05-22 17:55:10 +00:00
854074ed0d [1] Add plots 2026-05-22 17:51:14 +00:00
729a0a8695 [1] Add benchmarking 2026-05-22 17:50:51 +00:00
cc8f679e79 [1] Add binary search tree 2026-05-22 17:50:06 +00:00
a3c64db4af [1] Add hash table 2026-05-22 17:49:33 +00:00
b6debe4706 [1] Initial linked list implementation 2026-05-22 17:49:01 +00:00
c6f4d5d158 [2] FINAL 2026-05-22 17:38:11 +00:00
665534bf01 [2] Add grafs and csv 2026-05-22 17:36:58 +00:00
c59ca74ab5 [2] Add maze`s 2026-05-22 17:35:33 +00:00
537bbb1458 [2] Add plots generator 2026-05-22 17:32:24 +00:00
c25ff8ca6e [2] add to correct brench 2026-05-22 17:30:49 +00:00
16c614341e [1] Add main.py 2026-05-22 17:29:56 +00:00
4d0d97116e added Astar 2026-05-22 20:25:06 +03:00
82e3cba902 [1] FINISH 2026-05-22 17:25:04 +00:00
152123768c [1] Add visualisation 2026-05-22 17:18:01 +00:00
a1f157b283 [1] Add benchmarking 2026-05-22 17:17:04 +00:00
00453eb033 add interface for strat 2026-05-22 20:15:29 +03:00
c009c610a6 [1] Implement binary search tree phonebook 2026-05-22 17:14:10 +00:00
d2001eaf53 [1] Implement hash table based on linked list buckets 2026-05-22 17:13:03 +00:00
eb6587c537 [1] Implement linked list phonebook 2026-05-22 17:11:40 +00:00
a3e40fe0d5 add interface MazeBuilder and TextFileMazeBuilder 2026-05-22 20:07:06 +03:00
9be996f8cd мучаюсь с файлами 2026-05-22 18:49:41 +03:00
danch0us
56a26a676a [2] 2nd zadanie, otchet, benchmark & cool_pics 2026-05-22 17:54:05 +03:00
e611cfe31b финальная версия отчета с графиками 2026-05-22 17:50:56 +03:00
9f9158b0c4 сделаны все графики 2026-05-22 17:43:21 +03:00
58b2b73c8a обновлены графики с актуальными данными 2026-05-22 17:27:40 +03:00
danch0us
949252d245 report added 2026-05-22 17:19:25 +03:00
24f11880e1 add maze report 2026-05-22 13:48:52 +03:00
5aac691724 add README 2026-05-22 13:48:25 +03:00
70c8bbf3e7 add demo 2026-05-22 13:48:08 +03:00
0f03b4edd4 add experiment 2026-05-22 13:46:32 +03:00
313fe75c36 generate mazes 2026-05-22 13:45:29 +03:00
2f980aaa77 add mazes 2026-05-22 13:43:23 +03:00
ae812457fb add maze_solver 2026-05-22 13:42:42 +03:00
75a182304e add data structures report 2026-05-22 13:22:00 +03:00
5959566f59 add lab1 2026-05-22 13:05:33 +03:00
6aca3619ba add README.md 2026-05-22 12:23:12 +03:00
5827416a2b add plots 2026-05-22 12:22:08 +03:00
2ff608b88f add experiment.py 2026-05-22 12:20:40 +03:00
666bc0af37 add ll, ht and bst 2026-05-22 12:18:09 +03:00
5a978707d8 added BFS and DFS 2026-05-22 00:51:21 +03:00
d8fb7ab226 Изсправил ошибки циклического импорта 2026-05-22 00:17:01 +03:00
SerKin0
c096613e08 [2] Обновление docstring классов в файле models/base.py и пути в документации 2026-05-22 00:05:59 +03:00
06f8192f6a Прописал init для всех модулей 2026-05-22 00:05:50 +03:00
c8694aa053 Добавил BFS
- Реализовал bfs
- Мелкие правки в dfs
- Переместил command в command(хватит bububu) может потом допишу реализацию
2026-05-21 23:40:09 +03:00
5fce1bb8a6 Добавил dfs
- чертовы координаты
- изменил положение observer
- изменил систему координат, привёл к единому стилю - столбец, строка
2026-05-21 23:31:17 +03:00
1d5a0f1539 исправлены ошибки 2026-05-21 22:48:47 +03:00
32ed692fd8 Merge branch 'lab2' of http://31.128.43.79:3000/stepushovgs/2026-rff_mp into lab2 2026-05-21 22:27:20 +03:00
26424c7d61 Загрузить файлы в «groshevava/docs/data» 2026-05-21 19:25:41 +00:00
483744b075 Загрузить файлы в «groshevava/docs» 2026-05-21 19:24:43 +00:00
473003b4ce [1] Лабораторная работа №1: 2026-05-21 22:10:20 +03:00
498d1250b9 начало реализации dfs, изменение соответствующей логики 2026-05-21 22:06:22 +03:00
de1f262581 [2] task2 2026-05-21 21:50:03 +03:00
d3212347dc полная реализация написана 2026-05-21 21:32:32 +03:00
1db901aba1 [1] data-structures(numeration fix) 2026-05-21 21:27:38 +03:00
55a9536ff9 [1] data-structures(report fix) 2026-05-21 21:23:34 +03:00
6adc15ccd3 [1] data-structures 2026-05-21 20:55:03 +03:00
1b7ad33278 [1] lab1 2026-05-21 20:29:55 +03:00
f1dfbea54b написана визуализация и протестирована 2026-05-21 20:07:21 +03:00
a169773089 [2]Добавление отчёта 2026-05-21 19:52:53 +03:00
6b26bf2b0c [1] task1 2026-05-21 19:42:48 +03:00
852a8d43bd [1] task1 2026-05-21 19:38:10 +03:00
dde7c1fce5 [1] data structures 2026-05-21 19:32:48 +03:00
52dd19b535 2 stage has been completed 2026-05-21 19:27:53 +03:00
7ea5690be9 [2]Реализация остальной части кода (без этапа 5) 2026-05-21 19:05:20 +03:00
1923a02552 [2]Реализация первых трёх этапов 2026-05-21 18:59:59 +03:00
3672b4f4d0 [2] Add report for 2-nd Zadacha 2026-05-21 14:26:58 +00:00
3daef7dcc9 [2] Add csv file with experemental data 2026-05-21 14:23:08 +00:00
e12d37f94b [2] Experimental module for algorithm performance comparison 2026-05-21 14:14:33 +00:00
ccf6b0e4dc [2] Add maze files for experiments 2026-05-21 14:13:35 +00:00
86b738f6a4 [2] Add MazeSolver orchestrator and interactive console game 2026-05-21 14:10:50 +00:00
6005f2f8b2 [2] Implement pathfinding strategies (BFS, DFS, A*) with Strategy pattern 2026-05-21 14:09:02 +00:00
28c4c61a68 [1] Add commt to right 2026-05-21 14:06:03 +00:00
b2128b0010 [1] Initial maze core classes 2026-05-21 14:04:04 +00:00
b8b7971d86 [1] Add report 1 exercize 2026-05-21 13:53:23 +00:00
535fd115b5 [1] Add plotting script for performance comparison 2026-05-21 13:43:06 +00:00
f57786fe3f [1] Run experiments and save results to CSV 2026-05-21 13:42:11 +00:00
09456b2a41 [1] Reanme benchmark.py 2026-05-21 13:40:57 +00:00
058a921ad5 [1] Create benchmark utilitie 2026-05-21 13:40:17 +00:00
45df39223d [1] Create data generation 2026-05-21 13:39:27 +00:00
c915f50377 [1] Implement binary search tree (BST) for phonebook 2026-05-21 13:37:55 +00:00
a95dbdf35b [1] Add hash table using linked list buckets 2026-05-21 13:36:53 +00:00
9d77a348f7 [1] Rename main.py 2026-05-21 13:35:47 +00:00
c19fa42056 [1] Initial linked list implementation for phonebook 2026-05-21 13:34:23 +00:00
3b072cee1c Добавлены графики 2026-05-21 16:30:23 +03:00
2163ccd0aa [1] initial commit 2026-05-21 13:55:57 +03:00
4e29dfb4bb Merge branch 'osininyai' of http://31.128.43.79:3000/osininyai/2026-rff_mp into osininyai 2026-05-21 13:50:28 +03:00
f89f54eddc [1] initial commit 2026-05-21 13:43:45 +03:00
e8de0e29c4 начата визулизация 2026-05-21 12:32:48 +03:00
06a8a01c7f Добавлен паттерн Observer. Подготовлены лабиринты и выполнены замеры 2026-05-21 02:17:21 +03:00
098ccd7af1 [2] MazeSolver 2026-05-21 00:41:30 +03:00
047c2baf6d [2] Стратегии поиска пути 2026-05-20 23:41:33 +03:00
303bcf3eae Merge branch 'task-2-oop' into ProninVV 2026-05-20 23:21:33 +03:00
8f4cf09083 изменил mazesolver теперь он выводит найденый маршрут 2026-05-20 23:16:07 +03:00
0f5089fb24 Сделал ConsoleView и MazeSolver 2026-05-20 23:07:51 +03:00
d975a736d1 [2] lab2 2026-05-20 23:04:18 +03:00
82e023dd36 Документация: добавлен финальный отчет LaTeX и скомпилированный PDF 2026-05-20 22:55:54 +03:00
ad8ae841b1 исправлены ошибки и проведено тестирование 2026-05-20 22:52:01 +03:00
324333c9aa исправлены алгоритмы поиска 2026-05-20 22:49:33 +03:00
e5493a5439 Добавленны заготовки для алгоритмов 2026-05-20 21:42:45 +03:00
oSTEVEo
107d5cbd61 Реализован этап 3, добавлен A*, некоторые исправления 2026-05-20 21:25:57 +03:00
Veronika Minina
eeecdd61cd Добавление отчёта 2026-05-20 21:04:47 +03:00
Veronika Minina
d8ab579a46 Конвертировка всех файлом в расширение py 2026-05-20 21:04:31 +03:00
Veronika Minina
5207bb8682 main 2026-05-20 21:04:07 +03:00
Veronika Minina
0d72312f50 experimentsBenchmark 2026-05-20 21:03:54 +03:00
Veronika Minina
d677c5c794 Команды 2026-05-20 21:03:42 +03:00
Veronika Minina
e3e6e176a4 Перемещение 2026-05-20 21:03:30 +03:00
Veronika Minina
3334a1de97 Commands 2026-05-20 21:03:16 +03:00
Veronika Minina
aaa3d93224 Консольная визуализация лабиринта 2026-05-20 21:03:04 +03:00
Veronika Minina
99daffa959 Интерфейс наблюдателя 2026-05-20 21:02:51 +03:00
Veronika Minina
af4dae63f5 solverMaze_solver 2026-05-20 21:02:40 +03:00
Veronika Minina
d8eebad0a5 Манхэттенская эвристика 2026-05-20 21:02:25 +03:00
Veronika Minina
ccb1fca2a9 Поиск в глубину 2026-05-20 21:02:13 +03:00
Veronika Minina
5647ac84f7 Поиск в ширину 2026-05-20 21:02:01 +03:00
Veronika Minina
055a73325b Стратегия 2026-05-20 21:01:48 +03:00
Veronika Minina
d6286add4a Загрузчик лабиринта 2026-05-20 21:01:37 +03:00
Veronika Minina
615c256eb0 Добавление 2026-05-20 21:01:20 +03:00
Veronika Minina
3d10d8f6b8 Добавление modelsMaze 2026-05-20 21:01:05 +03:00
Veronika Minina
8ea4281568 изменение 2026-05-20 21:00:52 +03:00
Veronika Minina
012638e1d8 Клетка лабиринта 2026-05-20 21:00:30 +03:00
e71fe47f8c [2] lab2 2026-05-20 20:55:28 +03:00
danch0us
af4d1c77c8 1 задание 2026-05-20 20:13:04 +03:00
danch0us
b26bb1d3e7 задание 1 2026-05-20 20:09:48 +03:00
008b62dac7 Добавление файла с отчётом по лаборатороной работе 2026-05-20 18:10:34 +03:00
fd25842806 Добавление файлов с результатом эксперимента и его графики 2026-05-20 18:01:46 +03:00
792142a260 Реализация экспериментальной части кода 2026-05-20 18:00:05 +03:00
928ac824f2 Реализация функций из первых трёх этапов 2026-05-20 17:18:29 +03:00
SerKin0
5525af0b26 [2] Начало тестов классов Cell и Maze 2026-05-20 13:51:55 +03:00
SerKin0
98c17e18fa [2] Добавление авто документации проекта второй лабораторной работы 2026-05-20 13:31:53 +03:00
SerKin0
05a9bdd8f4 [2] Добавление первых версий классов Cell и Maze 2026-05-20 13:31:25 +03:00
c9448652cf Добавил реализацию для классов
- Cell
- Maze
- TextFileMazeBuilder
2026-05-20 13:05:52 +03:00
SerKin0
d05d292101 [2] Стартовая сборка 2026-05-20 11:38:02 +03:00
SerKin0
e45f8cba64 [1] Обновление .gitignore 2026-05-20 11:31:35 +03:00
8dafdab90e 1 stage has been complited 2026-05-20 01:17:12 +03:00
Alex
3fa79f06c3 [2] Task 2 2026-05-19 22:39:51 +03:00
8a6344f301 написано тестирование 2026-05-19 22:35:33 +03:00
4422dcb9e7 [2] mazebuilder 2026-05-19 22:26:42 +03:00
Alex
e10b075b06 [1] Task 1 2026-05-19 22:11:31 +03:00
8331065da2 реализован алоритм Дейкстра 2026-05-19 22:06:13 +03:00
f89d10b615 реализован класс Observer 2026-05-19 22:05:35 +03:00
47404cfa9d [2] Классы cell и maze + мал. лабиринт 2026-05-19 21:46:18 +03:00
74935d19f7 add_Report 2026-05-19 21:24:51 +03:00
91f5558c26 Vivod_programs 2026-05-19 21:22:23 +03:00
2670cbf971 Programs 2026-05-19 21:21:14 +03:00
ee0aecd7ca for 1-st ex 2026-05-19 21:14:37 +03:00
a27f861edf реализован поиск A* 2026-05-19 20:44:08 +03:00
838c2afa68 for 1-st ex 2026-05-19 20:40:51 +03:00
2449eeb26f реализован поиск в глубину 2026-05-19 18:17:35 +03:00
3869ff11ed отчет 2026-05-18 23:55:30 +03:00
45edc73aa2 Закончена практика 2026-05-18 22:11:37 +03:00
d0b791287f solver 2026-05-18 22:10:10 +03:00
df29d66f15 удалено тестирование 2026-05-18 20:55:51 +03:00
06b5b017e4 готовы все этапы и прошли тестирование 2026-05-18 20:55:01 +03:00
64978d3245 стратегии работают тестировние прошли 2026-05-18 20:23:06 +03:00
01eabf2655 [2] 1-st exersize 2026-05-18 20:08:09 +03:00
9de2a5fb39 [1] 1-st exersize 2026-05-18 20:07:05 +03:00
SolovevDD
27865cf7d4 [2] report for 1-st exersize 2026-05-18 20:05:09 +03:00
SolovevDD
4f28fd2015 [1] 1-st exersize LinkedListPhoneBook 2026-05-18 19:54:47 +03:00
SolovevDD
fd110e4193 [1] 1-st exersize LinkedListPhoneBook 2026-05-18 19:50:44 +03:00
SolovevDD
82f0fc13e9 [1] 1-st exersize LinkedListPhoneBook 2026-05-18 19:32:30 +03:00
6932687d9c загруска лабиринта из файла (Builder) и успешный тест 2026-05-18 19:28:00 +03:00
Кирюшкин Павел Андреевич
014ed32f08 [0] initial commit 2026-05-18 19:16:47 +03:00
66379d36b5 добавлены классы cell и maze 2026-05-18 18:39:08 +03:00
d04641b742 [2]zadanie2 2026-05-18 17:35:46 +03:00
Иван
7a147d6cb4 [1] add graph with results 2026-05-18 17:11:16 +03:00
Иван
c660025b78 [1] add task report 2026-05-18 16:16:22 +03:00
59343dd756 [7] FINAL add maze.txt files for prog. 2026-05-18 12:35:39 +00:00
5a370d5c38 [6.2] Final add report-2-nd.md 2026-05-18 12:32:31 +00:00
7082d8c91e [6.1] add same png to enover directory to add it in report-2-nd.md 2026-05-18 12:28:27 +00:00
4de79db243 [6] add csv and png generated by maze-plots.py 2026-05-18 12:26:25 +00:00
c20f64d1e0 [5] Add plots generator 2026-05-18 12:22:39 +00:00
9536ba1378 [4] Add player cycle to maze-core.py 2026-05-18 12:21:44 +00:00
51664b3273 [3] MORE FUNC to maze-core.py 2026-05-18 12:21:12 +00:00
dd23a3943f [2] add more func to maze-core 2026-05-18 12:20:24 +00:00
dd70b0b988 [1] Add maze-core ver 1 2026-05-18 12:19:14 +00:00
Иван
6ea13ecb26 [1] add timing tests and results 2026-05-18 15:11:59 +03:00
Иван
d4fcd67dde [1] fix bst for sorted records 2026-05-18 15:01:39 +03:00
Иван
d694f5ce0b [1] add basic tests 2026-05-18 14:58:55 +03:00
Иван
849eaf018d [1] add phonebook structures 2026-05-18 14:48:32 +03:00
dabd0acd9e strategies 2026-05-18 13:39:13 +03:00
8c230c900c builder 2026-05-18 00:40:59 +03:00
67a61da62b добавлена хэш таблица 2026-05-17 23:20:06 +03:00
6d20cba4ae model 2026-05-17 22:20:25 +03:00
b822b9c524 [1][2] lab1 structures and lab2 maze 2026-05-17 22:06:27 +03:00
a2c0cb7e8a добавлен отчёт 2026-05-17 18:20:03 +03:00
5212aff3d6 Реализованы все структуры 2026-05-17 18:18:36 +03:00
e2c95c6096 исправлена эксперементальная часть 2026-05-17 16:52:03 +03:00
94167bedca [2] labirint 2026-05-17 16:50:48 +03:00
0f511b0572 [2] labirint 2026-05-17 16:50:47 +03:00
shalovsa
8c7cc741fe [2] labirint 2026-05-17 16:50:47 +03:00
eab701c381 добавлена главная программа 2026-05-17 16:44:35 +03:00
fa44cff7df [1] lab1 2026-05-17 15:36:14 +03:00
MariiaOs
cf755242e1 [1] task 1 2026-05-17 15:15:28 +03:00
51cae5d065 добавлено экспериментальное сравнение алгоритмов 2026-05-17 15:11:11 +03:00
MariiaOs
f788fb2c8b [1] task 1 2026-05-17 15:07:28 +03:00
MariiaOs
634b76c127 [1] task 1 2026-05-17 15:01:19 +03:00
95dd862d49 добавлены команды для управления 2026-05-17 14:48:41 +03:00
88fe6c89c8 добавлена визуализация 2026-05-17 14:43:37 +03:00
2249493cc9 добавлен оркестратор 2026-05-17 14:27:17 +03:00
87d8fa16d7 добавлен код strategies 2026-05-17 14:00:40 +03:00
9696f6c5f1 добавлен код builders 2026-05-17 13:38:32 +03:00
d302eea649 добавлен код models 2026-05-17 13:25:07 +03:00
0b78ffd2c8 Список и еще чуть чуть 2026-05-17 01:49:59 +03:00
oSTEVEo
d5f28df86a Рефакторинг: Вынес restorePath() в отдельный общий файл 2026-05-17 00:48:23 +03:00
oSTEVEo
1a562a7594 Реализован DFS 2026-05-17 00:45:29 +03:00
SerKin0
e0e7f9eb57 [1] Контрольная точка (Бинарное дерево) 2026-05-17 00:04:06 +03:00
a051b1ab33 laba2 2026-05-16 23:00:38 +03:00
67aed44db0 исправление 2026-05-16 21:16:45 +03:00
cfa0475158 доп.тест 2026-05-16 21:06:11 +03:00
550af0164c дабавлена стратегия ширины 2026-05-16 20:46:12 +03:00
303da5bdc5 тест полной программы (Успех) 2026-05-16 20:01:46 +03:00
Veronika Minina
d5fd0a13aa Удаление файла 2026-05-16 19:53:22 +03:00
Veronika Minina
30a3106c29 удаление 2026-05-16 19:47:10 +03:00
Veronika Minina
185b34ea8a Добавление отёта 2026-05-16 19:43:31 +03:00
Veronika Minina
674eac23df добавление фото с графиками 2026-05-16 19:35:25 +03:00
oSTEVEo
89c11085ba Реализован BFS, созданы шаблоны для всех алгоритмов 2026-05-16 19:20:59 +03:00
oSTEVEo
f3978396eb Фикс width <=> height в maze.py 2026-05-16 19:19:51 +03:00
Veronika Minina
f08b18dc34 initial commit 2026-05-16 18:56:48 +03:00
Veronika Minina
4f147b1f47 добавление 2026-05-16 18:30:08 +03:00
Veronika Minina
e90f8d280b Удаление 2026-05-16 18:24:12 +03:00
Veronika Minina
5fde0be53d Удаление 2026-05-16 18:23:01 +03:00
Veronika Minina
fcf629d82d [0] initial commit 2026-05-16 18:18:22 +03:00
Veronika Minina
ca14a24f91 [0] initial commit 2026-05-16 18:13:02 +03:00
Veronika Minina
c342aee89c [0] initial commit 2026-05-16 18:08:27 +03:00
Veronika Minina
061eb851af [0] initial commit 2026-05-16 17:28:21 +03:00
Veronika Minina
92b22e1539 [0] initial commit 2026-05-16 08:11:42 +03:00
e306180a73 [1] task1 2026-05-15 22:30:09 +03:00
b367852062 Пункт 3: реализованы структуры данных (LinkedList, HashTable, BST) 2026-05-15 18:43:27 +03:00
b6c595a11a [2] Final 2026-05-15 09:42:46 +03:00
bb1a35103e [2] add player mode 2026-05-15 09:16:11 +03:00
133d076666 [2] add stats(time of compliting maze) 2026-05-15 09:02:06 +03:00
57c743c253 [2] add Astar method 2026-05-15 08:52:56 +03:00
617d205458 [2] Start 2-nd exersize 2026-05-15 08:05:17 +03:00
d1d1c8cdda [1] zadanie1 2026-05-14 22:49:35 +03:00
dde8ede88d [1] zadanie1 2026-05-14 22:40:34 +03:00
c24592d4e2 написана сборка лабиринта из файла 2026-05-14 20:18:53 +03:00
e77bf45914 Добавлены 3, 4 этапы 2026-05-14 18:51:29 +03:00
3fbb3cf061 Merge stepushovgs и lab1(только папка stepushovgs) 2026-05-14 18:47:14 +03:00
f62aa21088 [5] lab_1 finished and merged 2026-05-14 18:01:51 +03:00
44b3b4938b [4] lab_1 otchet + experiment data + graphics 2026-05-14 17:53:05 +03:00
fc40a296f9 маленький баг фикс 2026-05-14 14:08:17 +03:00
101a3d7bd2 Обновление md файла 2026-05-14 13:46:11 +03:00
f7e5e49bf5 Добавленны новый график сравнения 2026-05-14 13:44:13 +03:00
8468109b7c [1] zadanie_1 2026-05-14 13:18:29 +03:00
56d69110d4 [1] add report for 1-st exersize 2026-05-14 01:16:31 +00:00
4f0127dbd8 [1] add grafs 2026-05-14 01:11:50 +00:00
4359668699 [1] add result.csv 2026-05-14 01:10:46 +00:00
f387b9020b [1] create bar charts for experiment results 2026-05-14 01:06:33 +00:00
164bcbb260 [1] add performance measurement with random/sorted datasets 2026-05-14 01:05:15 +00:00
90e28edfbe [1] update file name 2026-05-14 01:03:55 +00:00
b7a6bcc77f [1] some changes ....... 2026-05-14 01:03:25 +00:00
20cf87fb40 [1] add basic tests for all structures 2026-05-14 01:02:55 +00:00
d263bab16d Обновить KislyuninED/docks/data/1-st-exercize/main.py 2026-05-14 01:00:11 +00:00
2052f2c4b8 [1] add hash table with fixed bucket count 2026-05-14 00:59:11 +00:00
b82a6e6f0d [1] add linked list phonebook implementation 2026-05-14 00:57:12 +00:00
f42be3b51a добавлен пункт 2: интрументы замера времени 2026-05-12 21:17:40 +03:00
169bdb376c grapgs 2026-05-12 20:36:42 +03:00
0badfa58a5 отчет проверен 2026-05-12 20:26:53 +03:00
1c210a9a0e [2] task 2 2026-05-12 12:02:51 +03:00
1ba3f2e17e [2] task 2 2026-05-12 12:02:04 +03:00
d3e85a11e0 Удалены лишние docx файлы 2026-05-12 10:18:29 +03:00
e24cb4fac4 results 2026-05-11 21:35:13 +03:00
65a735d8a4 Убраны правки из общего .gitignore в первом задании 2026-05-11 21:17:44 +03:00
shalovsa
7103ff2e5b [1] работа завершена 2026-05-11 17:47:36 +03:00
shalovsa
9ada5f7c9f [1] исправил отчёт 2026-05-11 17:25:51 +03:00
shalovsa
b8b0e6d50f [1] подправлен отчёт 2026-05-11 17:11:43 +03:00
shalovsa
4cef754f29 [1] отчёт + работа завершена 2026-05-11 17:09:55 +03:00
shalovsa
d0130e9280 [1] добавлены графики 2026-05-11 17:06:58 +03:00
shalovsa
980da05ed5 [1] файл для запуска измерений 2026-05-11 17:01:04 +03:00
shalovsa
30d416cfac [1] добавлены структуры 2026-05-11 16:54:44 +03:00
15ec46afb3 [1] лаба 1 2026-05-11 16:40:10 +03:00
7ca6fec5f6 [1] задание 1 2026-05-11 16:37:10 +03:00
6c9a56505a реализация двоичного дерева поиска, а также импорт библиотек 2026-05-10 21:16:48 +03:00
57fa3a3232 добавление ll_collect 2026-05-10 21:03:20 +03:00
809294edae реализация хеш-функции 2026-05-10 20:51:53 +03:00
15402bc076 summarizing the results of the work performed 2026-05-10 18:50:24 +03:00
666638009e [1] Отчёт (Исправлены графики) 2026-05-10 18:30:32 +03:00
e2912c5b53 [1] Отчёт (Исправлены графики) 2026-05-10 18:28:55 +03:00
e38b44c9c7 [1] Отчёт 2026-05-10 18:26:05 +03:00
166f66b761 реализация связного списка 2026-05-10 18:20:20 +03:00
af1a7f60ab creating a CSV file and creating a graph 2026-05-10 15:30:37 +03:00
fccea76cef add test for HashTable and BinaryTree, bug fix 2026-05-10 13:00:19 +03:00
a830e4d7a2 Выполнены этапы 1, 2, в 3 реализовано BFS 2026-05-09 22:37:10 +03:00
66b713028b [7] добавлен отчёт по второму заданию 2026-05-09 16:59:18 +03:00
9a0d642c3c [6] я забыл инклюднуть файлы xd 2026-05-09 16:12:27 +03:00
b1331cab37 [5] больше лабиринтов + стата 2026-05-09 16:08:21 +03:00
03112f53fa [0] initial commit 2026-05-08 16:51:41 +00:00
cd70aa81c6 [6] FINISH 2026-05-08 16:50:34 +00:00
608ddb6c48 [5] FINISH 2026-05-08 16:49:54 +00:00
fc641dda09 [4] FINISH 2026-05-08 16:49:01 +00:00
f0dafc0e70 [3] 2026-05-07 13:56:15 +00:00
2dfa9768ec [2] 2026-05-07 13:29:04 +00:00
31466e3743 [5] пара лабиринтов для тестов 2026-05-07 15:54:10 +03:00
0895815b29 [4] там было должно быть больше чем 1 и вообще не те лабиринты 2026-05-07 15:13:55 +03:00
049944be2a [0] основной файл, нужно сделать лабиринты + отчёт 2026-05-07 15:09:26 +03:00
0a64c55bdc [1] 2026-05-07 11:21:31 +00:00
ac37de72ba [0] initial commit 2026-05-07 11:20:05 +00:00
0506c25873 Удалить lukovnikovde/docs/report.md 2026-05-07 11:10:14 +00:00
a2f0271d0f Обновить lukovnikovde/docs/report.md 2026-05-07 11:10:03 +00:00
09a773a602 [0] initial commit 2026-05-07 11:09:48 +00:00
c2a18971ab [0] initial commit 2026-05-07 11:05:39 +00:00
e0039ceeff Удалить lukovnikovde/docs/data/time_schedule.png 2026-05-07 11:05:22 +00:00
9a7b0ce54f [4] updating data 2026-05-07 11:04:59 +00:00
2b906cde43 [17] FINISH 2026-05-07 11:03:49 +00:00
3b1ea1c519 measurements 2026-05-06 22:50:33 +03:00
2e92918882 Добавил папку docs и файл README 2026-05-06 21:14:00 +03:00
d71c9d311e [16] adding plt 2026-05-06 14:33:17 +00:00
17d62ab5ad [0] initial commit 2026-05-06 14:32:20 +00:00
4fc4ce2070 [3] updating data 2026-05-06 14:31:21 +00:00
e4e9216bdc Удалить lukovnikovde/docs/data/Снимок экрана 2026-05-06 141650.png 2026-05-06 14:23:14 +00:00
3151752151 [0] time schedule for various operations 2026-05-06 14:22:45 +00:00
c6cbce12cc [2] updating data 2026-05-06 14:18:39 +00:00
81899baf6e [15] adding file_insert() to create a csv file 2026-05-06 12:56:10 +00:00
7c65ec1f5c [1] adding data 2026-05-06 12:53:58 +00:00
a784a4a037 [14] adding time for BinarySearchTree() 2026-05-06 09:42:03 +00:00
bd4d6d48a0 [13] adding time for HashTable() and fixing BinarySearchTree() 2026-05-06 09:27:45 +00:00
247e9a1224 Bag fix and add test for LinkedList 2026-05-05 22:20:24 +03:00
96ab380c9e docs: add report 2026-05-05 01:44:15 +03:00
c6a7fc6657 docs: clean up README 2026-05-05 01:44:00 +03:00
d1e3d2c791 generation function 2026-05-05 00:22:43 +03:00
cf00e72307 bst 2026-05-04 23:23:06 +03:00
106ee680c1 начат отчет 2026-05-04 20:35:21 +03:00
89f567e365 исправлена таблица 2026-05-04 20:13:58 +03:00
4aec0f3336 сделана таблица для отчета 2026-05-04 20:13:14 +03:00
1feef42010 добавлены графики 2026-05-04 19:51:45 +03:00
cfa44a996c тестирование прошло успешно, эксперименты завершены 2026-05-04 19:09:16 +03:00
5770c59bdf hash_table 2026-05-03 23:26:35 +03:00
2f7370eb01 linked_list 2026-05-03 22:59:04 +03:00
2ce10515cd files 2026-05-03 22:39:03 +03:00
98d0fcdebb [1] Функция 2026-05-03 19:07:02 +03:00
305a169a0e добавлен отчёт к лабораторной работе 1 2026-05-03 11:35:07 +03:00
e792b1ac2f добавлены: таблица, графики и финальная часть кода 2026-05-03 11:02:27 +03:00
221b0dbe36 [1] adding random 2026-05-02 15:04:26 +00:00
edf667e378 создал папки 2026-05-02 17:49:19 +03:00
cae38a7812 Добавить code 2026-05-02 13:03:06 +00:00
a9d5835d7f [12] adding time for LinkedList 2026-05-02 11:22:33 +00:00
f9461cd010 [0] initial commit 2026-05-02 10:08:46 +00:00
cf54fc4931 [11] adding bst_delete() and bst_list_all 2026-05-02 09:58:29 +00:00
be98a893a1 [2] maze 2026-05-02 06:49:44 +03:00
kirill
b515024d07 add report 2026-05-01 23:49:53 +03:00
b647f5af59 [10] adding bst_find() 2026-05-01 16:47:22 +00:00
6849fc4802 [9] adding bst_insert() 2026-05-01 16:26:24 +00:00
6cbe3dc439 [8] adding ht_delete() 2026-05-01 15:36:41 +00:00
ddaef4333a [7] adding ht_find() and ht_list_all 2026-05-01 15:22:46 +00:00
289171aac5 [6] correction ht_insert() 2026-05-01 14:59:57 +00:00
6dba583f2c [5] adding ht_insert() 2026-05-01 13:48:41 +00:00
232585fa83 забыл убрать кусок кода с тестом data_structures. Убрал 2026-05-01 15:12:51 +03:00
54ab958f19 Добавил отчет и файлы по 1 лабе 2026-05-01 15:03:04 +03:00
4faacbc4ed [4] adding ll_list_all() and sort_list() 2026-05-01 08:09:09 +00:00
ce2b43a84e Добавлен отчет 2026-05-01 01:13:46 +03:00
3f9c9f0ca8 Добавилась единая шкала для всех графиков 2026-05-01 00:08:57 +03:00
7e00598b8f [1] task 1 2026-04-30 23:54:08 +03:00
3714c824e7 Добавлено автоматическое определение пути для сохранения 2026-04-30 22:21:16 +03:00
3d82bdd4cd [0] initial commit 2026-04-30 21:28:06 +03:00
033419ac3f Изменена реализация заданий 2026-04-30 16:38:06 +03:00
a94ba3321a [1] trask1 2026-04-30 16:20:23 +03:00
dec46dcc0a Выполнены задания в экспериментальной части до построения графиков 2026-04-30 00:48:40 +03:00
87fa0e9c66 Добавлены функции для всех структур 2026-04-29 23:31:28 +03:00
053e635cda [1] task1 2026-04-29 18:05:19 +03:00
oSTEVEo
c7c181f30b Реализован этап 2 2026-04-28 01:11:11 +03:00
82e988c965 Merge pull request '[0] initial commit' (#170) from Smirnovvs/2026-rff_mp:Smirnovvs into develop
Reviewed-on: UNN/2026-rff_mp#170
2026-04-27 18:05:51 +00:00
58daf860ed Merge pull request '[0] initial commit' (#167) from kalinovskiymi/2026-rff_mp:kalinovskiymi into develop
Reviewed-on: UNN/2026-rff_mp#167
2026-04-27 18:05:12 +00:00
a095930b97 добавлены генерация тестовых данных и замер времени 2026-04-27 20:12:20 +03:00
e1ad783b49 добавлена реализация дерева 2026-04-27 19:51:58 +03:00
76b52b99e4 добавлена реализация хеш-таблицы 2026-04-27 18:51:01 +03:00
09e7e59f55 исправлено csv 2.0 2026-04-26 22:04:01 +03:00
f914a177a5 исправлена опечатка в csv 2026-04-26 21:24:23 +03:00
c32fd836b5 исправлено двоичное дерево 3.0 2026-04-26 21:17:46 +03:00
c76eb6f91b двоичное дерево исправлено 2.0 2026-04-26 20:49:48 +03:00
0046bde759 исправлено двоичное дерево и исправлены опечатки 2026-04-26 20:41:45 +03:00
be927fd028 сохранение csv 2026-04-26 19:31:21 +03:00
409b7dde52 замеры двоичное дерево изменено 2026-04-26 18:47:53 +03:00
eeb0e16665 замеры для хеш-таблицы 2026-04-26 18:28:36 +03:00
1d224e6171 замеры для связного списка 2026-04-26 17:52:13 +03:00
274784ea0a добавлен файл с генерацией тестовых данных 2026-04-26 16:39:00 +03:00
d43389ec5e все структуры данных 2026-04-26 16:06:33 +03:00
ff0f375cb3 [1] Task 1 (Completed) 2026-04-26 15:58:38 +03:00
ee11ed639f Task 1: complete phonebook structures with report and graphs 2026-04-26 01:05:33 +03:00
b07adc7cb4 добавлена реализация связного списка 2026-04-26 00:23:49 +03:00
40866a3eb3 Clean up: ignore unnecessary files 2026-04-25 23:59:55 +03:00
03c6ce2dbd Remove Task 1.py 2026-05-23 18:56:06 +03:00
155b75f45d Start 2026-05-23 18:45:47 +03:00
9f4b31ab1f добавлены библиотеки 2026-04-25 23:49:07 +03:00
39816756a3 добавлен новый файл для кода 2026-04-25 22:48:01 +03:00
e04af3d044 удалён файл code 2026-04-25 22:33:17 +03:00
db1243ce91 [1] ll_func 2026-04-25 16:37:33 +03:00
566d89fda2 Merge pull request '[0] initial commit' (#166) from dyachenkoas/2026-rff_mp:dyachenkoas into develop
Reviewed-on: UNN/2026-rff_mp#166
2026-04-25 09:27:44 +00:00
c7229154ca Merge pull request '[0] initial commit' (#158) from MalkinMV/2026-rff_mp:MalkinMV into develop
Reviewed-on: UNN/2026-rff_mp#158
2026-04-25 09:25:55 +00:00
e19ddcdcb1 добавил текстовый файл 2026-04-25 00:57:56 +03:00
oSTEVEo
b002e85958 Реализован этап 1 2026-04-24 06:14:07 +03:00
38947e9174 [1] Законченная программа, таблица, графики 2026-04-23 23:01:03 +03:00
9ab957e484 [3] lab_1 + bst functions 2026-04-23 14:46:35 +03:00
68fa9dfbee [2] lab_1 ll and ht + restructured folders 2026-04-23 10:12:16 +03:00
95d00a8942 [3] adding ll_delete() 2026-04-22 16:50:01 +00:00
ace43f35b0 [2] adding ll_find 2026-04-22 14:04:25 +00:00
5831480b1b [1] adding ll_insert(...) 2026-04-22 14:02:37 +00:00
e9dc413227 Обновить lukovnikovde/docs/data/DataStructure.py
[2] adding ll_find
2026-04-22 13:55:50 +00:00
147e3da053 реализованные шаблоны для структур данных 2026-04-21 19:51:43 +03:00
f1ed7c9c9a docs: add README with usage instructions 2026-04-21 03:16:15 +03:00
a7cdcd99b9 feat: add root entry point for the experiment
chore: add missing newline in ht.py
2026-04-21 03:15:13 +03:00
2833af077e feat: implement plot.py and save results 2026-04-21 03:03:13 +03:00
11f600ea1c refactor: restructure project and fix relative imports 2026-04-21 02:58:47 +03:00
f6478ee72e [1] update binary tree 2026-04-20 20:20:16 +03:00
kirill
d232cc536d add experiment and plots 2026-04-20 18:41:33 +03:00
fa690cac57 [1] add dst_insert and dst_find 2026-04-20 13:43:18 +03:00
22ccd192ba feat: implement the experiment 2026-04-19 20:56:50 +03:00
798e9ae052 добавлена хеш-таблица 2026-04-19 20:19:23 +03:00
b4f085d0f9 реализован связный список 2026-04-19 19:38:18 +03:00
7f1acffb4c [1] Генерация тестовых данных и замер времени 2026-04-19 16:46:31 +03:00
74b9fc8790 [1] 1st lab data create 2026-04-19 16:27:02 +03:00
0f97a32fed [1] Добавлены функции для дерева поиска 2026-04-17 20:05:08 +03:00
c3ed1e09f1 [3] add hash table 2026-04-16 15:45:30 +03:00
85a4936d4c [3] add hash table 2026-04-16 15:05:54 +03:00
5ed12f966f [1] Добавлены функции для хэш таблицы 2026-04-16 01:50:52 +03:00
a597b5e46f [1] Добавлены функции связного списка 2026-04-16 01:40:22 +03:00
kirill
da3aad1c55 add bst 2026-04-16 01:01:14 +03:00
a160c41a66 [2] full implementation of a linked list 2026-04-15 23:30:55 +03:00
2b8170c6c8 [1] add LinkList 2026-04-15 16:49:57 +03:00
8a6733893e feat: implement data generation 2026-04-14 23:29:24 +03:00
fd715f4191 feat: implement binary search tree 2026-04-14 01:55:05 +03:00
0a2e237e5b feat: implement hash table 2026-04-13 21:51:30 +03:00
kirill
f2df567d0f add ht 2026-04-13 19:02:45 +03:00
6d5dce4306 [1] create branch 2026-04-13 18:40:10 +03:00
kirill
4cb30a7747 add ll 2026-04-13 13:24:59 +03:00
a741e56d3c feat: implement linked list 2026-04-13 01:36:00 +03:00
c5bf9aacd5 Добавить nikolaevda/test file 2026-04-11 16:17:33 +00:00
oSTEVEo
cd62d229a5 Закончен отчёт по 1 лабе 2026-04-11 14:23:15 +03:00
2f56564cd9 Обновить lukovnikovde/docs/data/DataStructure.py
[0] add a function ll_insert
2026-04-10 04:26:53 +00:00
8b4083725b [0] initial commit 2026-04-10 02:39:05 +03:00
3954dd5218 initial commit 2026-04-10 02:12:51 +03:00
6716bd1d0b Add data generation 2026-04-08 22:01:28 +03:00
6e4ae1835b Merge pull request '[1] initial commit' (#171) from osipovamd/2026-rff_mp:osipovamd into develop
Reviewed-on: UNN/2026-rff_mp#171
2026-04-05 10:54:06 +00:00
oSTEVEo
94a9cba182 Пара исправлений 2026-04-05 10:06:28 +03:00
MariiaOs
25341dc814 [1] initial commit 2026-04-04 17:13:00 +03:00
fe9ce65eb2 [0] initial commit 2026-04-04 14:46:15 +03:00
405d1e583b Merge pull request '[0] initial commit' (#162) from varnakovaa/2026-rff_mp:VarnakovAA into develop
Reviewed-on: UNN/2026-rff_mp#162
2026-04-04 09:12:00 +00:00
74807f5514 Обновить README.md 2026-04-04 07:11:52 +00:00
oSTEVEo
cb02fb20fe Переделан и реализован подсчёт времени для каждой СД 2026-04-03 01:31:26 +03:00
oSTEVEo
94bc3b8524 Pylance fixes 2026-04-03 01:30:35 +03:00
oSTEVEo
7026ad395d Начат отчёт 2026-03-30 17:47:24 +03:00
Veronika Minina
05c9a03eea initial commit 2026-03-29 13:38:54 +03:00
3a251f06c7 Добавить kalinovskiymi/428 2026-03-27 20:48:17 +00:00
d396e7391b итоговая подготовка к пулл реквесту 2026-03-24 23:04:25 +03:00
40643fd7a7 Cleanup: remove csv results and latex artifacts 2026-03-24 22:59:43 +03:00
72d9afb7c5 Cleanup: remove latex artifacts 2026-03-24 21:47:50 +03:00
ea742e432f версия работы 1.1 2026-03-24 21:12:09 +03:00
5fbb0eee9c Исправлены критические ошибки при снатии данных опыта и переделаны графики 2026-03-24 18:08:56 +03:00
e4c7e2d97a [0] initial commit 2026-03-23 21:32:01 +03:00
oSTEVEo
dd4eca8407 Полностью реализован BinaryTree 2026-03-23 00:07:17 +03:00
Veronika Minina
5d94d3f44e [0] initial commit 2026-03-22 18:53:04 +03:00
oSTEVEo
b383ed1cdc Реализован bst_insert 2026-03-22 00:39:01 +03:00
oSTEVEo
9bdefcc922 Реализован HashTable 2026-03-21 23:41:46 +03:00
oSTEVEo
0b092e8d26 Обновлён .gitignore 2026-03-21 22:30:43 +03:00
oSTEVEo
b984ec3569 Перемещены файлы и добавлена реализация LinkedList 2026-03-21 22:30:40 +03:00
oSTEVEo
9c1cd94e87 Добавлен .gitignore для vscode 2026-03-21 22:30:36 +03:00
oSTEVEo
8124c755f8 Добавлены шаблоны для реализации структур 2026-03-21 22:30:30 +03:00
937738c8eb [3] finished report and task 1 2026-03-21 21:25:58 +03:00
34d23ee54b первая весия работы 2026-03-21 21:22:39 +03:00
65e95f876b Построены графики 2026-03-21 20:53:41 +03:00
0352511b04 [2] fixed missing folder 2026-03-21 20:52:48 +03:00
ced958df1e [1] now formatted how it should be 2026-03-21 20:50:47 +03:00
ec3d83df97 сделан анализ данных 2026-03-21 18:21:24 +03:00
3f8ed5a93a ig thats it for now 2026-03-21 17:01:40 +03:00
cb178427ca merge: combine with remote ivantsovma branch 2026-03-21 15:41:46 +03:00
d51f3fe51e now with hash😎 2026-03-21 15:23:20 +03:00
191fc23b52 reworking 2026-03-21 15:21:43 +03:00
MalkinMV
7e84caffc4 [0] initial commit 2026-03-21 10:29:10 +03:00
84e5d1e763 Добавить dyachenkoas/428 2026-03-21 03:26:23 +00:00
cb970daadf Проведены все тестирования 2026-03-20 23:32:11 +03:00
ffb0de63df Исправлены ошибки программы тестирования, проведены завмеры 2026-03-20 21:38:43 +03:00
edea3cf379 Написан код тестирования структур 2026-03-20 20:59:23 +03:00
67897bd14b написаны структуры данных 2026-03-19 14:04:50 +03:00
Veronika Minina
b16d3da3e2 [0] initial commit 2026-03-19 09:36:51 +03:00
SerKin0
83651244fe [1] Добавлены docstring к функциям 2026-03-18 19:52:13 +03:00
SerKin0
e590e7d02d [1] Дописаны тесты базовых функций задания
- Добавлен тест ll_delete
2026-03-18 14:17:11 +03:00
SerKin0
dc7f07b42b [1] Добавлены основные функции задания и некоторые тесты
- Сделана ll_insert
- Редактирована ll_find
- Сделана ll_delete
- Сделана ll_list_all

Тесты:
- Для create_linked_list
- Для ll_find
- Для ll_insert
2026-03-18 13:49:02 +03:00
SerKin0
de73e9247b [1] Добавление .gitignore 2026-03-18 13:33:50 +03:00
a088b72b20 [0] initial commit 2026-03-18 11:57:08 +03:00
3438fa1fe9 [1] Structura_data 2026-03-15 19:24:49 +03:00
ad2d65b1cc [1] struct_data 2026-03-15 19:17:37 +03:00
557d45e06e [1] struct dannych 2026-03-15 18:54:31 +03:00
dfdee49e2d Please enter the commit message for your changes. Lines starting
delete 428.txt
2026-03-15 18:43:44 +03:00
f5b0fec46f Merge pull request '[1] FINISH 1-st-exercise' (#148) from IvanBud123/2026-rff_mp:1-st-exercise into develop
Reviewed-on: UNN/2026-rff_mp#148
2026-03-15 06:42:22 +00:00
e4423a3be8 Merge pull request '[0] initial commit' (#154) from BoriskovaDV/2026-rff_mp:BoriskovaDV into develop
Reviewed-on: UNN/2026-rff_mp#154
2026-03-15 06:41:55 +00:00
eeb28d8b6a [0] init 2026-03-15 05:18:35 +00:00
b3e4b6149e docs 2026-03-15 02:46:48 +00:00
c98c8a472b Merge pull request '[0] initial commit' (#152) from victorovaas/2026-rff_mp:victorovaas into develop
Reviewed-on: UNN/2026-rff_mp#152
2026-03-14 09:27:51 +00:00
Git Version Control
666e6ecd41 [1] ... README.md 2026-03-12 04:02:58 +00:00
062d3b983e Merge pull request '[0] initial commit' (#151) from KislyuninED/2026-rff_mp:KislyuninED into develop
Reviewed-on: UNN/2026-rff_mp#151
2026-03-10 08:17:33 +00:00
197c266cd4 [0] initial commit 2026-03-07 17:15:56 +03:00
b874ac28aa Merge pull request '[0] initial commit' (#149) from SavelevMI/2026-rff_mp:SavelevMI into develop
Reviewed-on: UNN/2026-rff_mp#149
2026-03-06 10:15:37 +00:00
SerKin0
88bcf8a761 [1] Написана функция поиска 2026-03-06 09:55:45 +03:00
4cef8060a3 [15] FINISH for 1-st exersize 2026-03-04 01:40:38 +03:00
50798eb572 Merge branch 'develop' into 1-st-exercise 2026-03-04 01:37:44 +03:00
7067bfa12a [14] FINISH for 1-st exersize 2026-03-04 01:14:58 +03:00
64f43373df [13] FINISH for 1-st exersize 2026-03-04 01:02:42 +03:00
da65d02bd7 [12] BIG UPDATE 2026-03-04 01:02:40 +03:00
0441c5076a [11] A minor update that fixes errors and typos 2026-03-04 01:02:37 +03:00
28de33a83d [10] A minor update that fixes errors and typos 2026-03-04 01:02:32 +03:00
49e91066d4 [9] finish with adding BST(Binar Search Tree) 2026-03-04 01:02:29 +03:00
bb28c3dd2f [8] start adding binar search func(create_node and bst_insert) 2026-03-04 01:02:26 +03:00
1ebec4223a [7] add hash func and tests of hash func 2026-03-04 01:02:23 +03:00
e868e94fcd [6] add hash func find, insert and hash_func 2026-03-04 01:02:17 +03:00
0e84534109 [5] modyfi LinkedListBook for 2-nd exersize 2026-03-04 01:02:11 +03:00
8c642fea20 [4] start coding hash-table 2026-03-04 00:56:59 +03:00
7dbd3075b6 [3] adding ll_list_all 2026-03-04 00:56:59 +03:00
050462d011 [2] adding ll_find and ll_delete 2026-03-04 00:56:59 +03:00
ba244f24bb [1] implemented the ll_insert function for an first exercise 2026-03-04 00:56:59 +03:00
39fe26b3f1 [0] initial commit 2026-03-04 00:56:59 +03:00
5de2cca73e Обновить README.md 2026-03-04 00:56:59 +03:00
8c17e92dd8 Удалить testfile.txt 2026-03-04 00:56:59 +03:00
b1cb2491d8 Обновить README.md 2026-03-04 00:56:59 +03:00
a5ee4d9ae5 Обновить README.md 2026-03-04 00:56:59 +03:00
fb8f0c47f5 Обновить README.md 2026-03-04 00:56:59 +03:00
099ec9f5e3 Обновить README.md 2026-03-04 00:56:59 +03:00
906250c019 docs: add final report with analysis 2026-03-01 22:12:14 +03:00
9b3a09740d report: add final report with analysis 2026-03-01 22:04:13 +03:00
15a055919c test(bst): add experiment results 2026-03-01 21:57:18 +03:00
d7c168cd1e test(hash-table): add experiment results 2026-03-01 21:56:04 +03:00
01acee8ea5 test(linked-list): add experiment results 2026-03-01 21:55:03 +03:00
77bc58e44b feat(linked-list): add basic node structure and insert function 2026-03-01 21:53:07 +03:00
68114824da Initial commit: create project structure 2026-03-01 21:09:17 +03:00
3f89175175 Merge pull request '[0] initial commit' (#144) from starikovta/2026-rff_mp:starikovta into develop
Reviewed-on: UNN/2026-rff_mp#144
2026-03-01 13:45:14 +00:00
3360e2dc8f Merge pull request '[0] initial commit' (#140) from MochalovAE/2026-rff_mp:MochalovAE into develop
Reviewed-on: UNN/2026-rff_mp#140
2026-03-01 13:44:44 +00:00
91b3c9a007 Merge pull request '[0] initial commit' (#138) from famutdinovmd/2026-rff_mp:famutdinovmd into develop
Reviewed-on: UNN/2026-rff_mp#138
2026-03-01 13:44:31 +00:00
fae14e7d1f problem with sorted list, needs rework in data generation 2026-02-28 19:36:32 +03:00
776ce4eec6 finished functions, making tests 2026-02-28 19:01:53 +03:00
c61dbc01a3 almost finished ll sequence, only sort is left 2026-02-28 18:13:05 +03:00
44552108d4 [0] initial commit 2026-02-28 17:53:25 +03:00
ff1063d866 [0] initial commit 2026-02-28 17:19:44 +03:00
38d4ae0d5e [0] initial commit 2026-02-28 16:42:45 +03:00
7adc1e91f5 [0] initial commit 2026-02-28 14:21:18 +03:00
d2b04e6f0e Merge pull request '[0] initial commit' (#137) from sorokinad/2026-rff_mp:SorokinAD into develop
Reviewed-on: UNN/2026-rff_mp#137
2026-02-28 10:59:40 +00:00
0206cfd65f Merge pull request '[0] initial commit' (#135) from SokolovNE/2026-rff_mp:SokolovNE into develop
Reviewed-on: UNN/2026-rff_mp#135
2026-02-28 10:58:21 +00:00
89f2fa1162 Merge pull request '[0]develop' (#136) from Ezhovnd/2026-rff_mp:develop into develop
Reviewed-on: UNN/2026-rff_mp#136
2026-02-28 10:58:02 +00:00
Морозов Никита С
7278f7d9db Merge branch 'ezhovnd' into develop 2026-02-28 13:55:21 +03:00
Сорокин Александр Д
14272a7c25 [0] initial commit 2026-02-28 13:53:01 +03:00
Морозов Никита С
e613581d34 [0] initial com mit 2026-02-28 13:44:09 +03:00
cdfdb49be1 [0] initial commit 2026-02-28 13:34:18 +03:00
52c001a380 Merge pull request '[0] initial commit' (#134) from nikitovie/2026-rff_mp:nikitovie into develop
Reviewed-on: UNN/2026-rff_mp#134
2026-02-28 10:21:56 +00:00
9dceb29513 [0] initial commit 2026-02-28 13:09:29 +03:00
f409499159 Merge pull request '[0] initial commit' (#133) from gutovvm/2026-rff_mp:GutovVM into develop
Reviewed-on: UNN/2026-rff_mp#133
2026-02-28 09:52:33 +00:00
59076d3df1 Merge pull request '[0] initial commit' (#132) from KolbasovPD/2026-rff_mp:KolbasovPD into develop
Reviewed-on: UNN/2026-rff_mp#132
2026-02-28 09:52:21 +00:00
3dbf137752 Merge pull request '[0] initial commit' (#128) from gorkinmm/2026-rff_mp:GorkinMM into develop
Reviewed-on: UNN/2026-rff_mp#128
2026-02-28 09:52:12 +00:00
918536d2ed Merge pull request '[0] initial commit' (#114) from groshevava/2026-rff_mp:groshevava into develop
Reviewed-on: UNN/2026-rff_mp#114
2026-02-28 09:52:01 +00:00
812f0acac2 Merge pull request '[0] initial commit' (#105) from KuznetsovMA/2026-rff_mp:KuznetsovMA into develop
Reviewed-on: UNN/2026-rff_mp#105
2026-02-28 09:51:40 +00:00
8a30aff913 Merge pull request '[0] initial commit' (#103) from zhigalovrd/2026-rff_mp:zhigalovrd into develop
Reviewed-on: UNN/2026-rff_mp#103
2026-02-28 09:51:17 +00:00
d157503ef2 Merge pull request '[0] initial commit' (#120) from shapovalovka/2026-rff_mp:shapovalovka into develop
Reviewed-on: UNN/2026-rff_mp#120
2026-02-28 09:51:03 +00:00
8d4e9ebeca Merge pull request '[0] initial commit' (#112) from kuznetsovTD/2026-rff_mp:kuznetsovTD into develop
Reviewed-on: UNN/2026-rff_mp#112
2026-02-28 09:50:50 +00:00
ec9b3fb7c6 Merge pull request '[0] initial commit' (#111) from bolonkinnm/2026-rff_mp:BolonkinNM into develop
Reviewed-on: UNN/2026-rff_mp#111
2026-02-28 09:50:07 +00:00
a29c7d7af6 Merge pull request '[0] initial commit' (#110) from ShulpinIN/2026-rff_mp:ShulpinIN into develop
Reviewed-on: UNN/2026-rff_mp#110
2026-02-28 09:49:54 +00:00
ef189db30c Merge pull request '[0] initial commit' (#117) from SokolovEN/2026-rff_mp:SokolovEN into develop
Reviewed-on: UNN/2026-rff_mp#117
2026-02-28 09:49:44 +00:00
110e13b31e Merge pull request '[0] initial commit' (#118) from VildyaevAV/2026-rff_mp:VildyaevAV into develop
Reviewed-on: UNN/2026-rff_mp#118
2026-02-28 09:49:34 +00:00
5640088b5a Merge pull request '[0] initial commit' (#121) from ZhuravlevDV/2026-rff_mp:ZhuravlevDV into develop
Reviewed-on: UNN/2026-rff_mp#121
2026-02-28 09:49:19 +00:00
d2b26c6f9e Merge pull request '[0] initial commit' (#108) from borisovmi/2026-rff_mp:BorisovMI into develop
Reviewed-on: UNN/2026-rff_mp#108
2026-02-28 09:49:08 +00:00
a48c0abf0d Merge pull request '[0] initial commit' (#104) from soninrv/2026-rff_mp:soninrv into develop
Reviewed-on: UNN/2026-rff_mp#104
2026-02-28 09:48:56 +00:00
6ec811b963 Merge pull request '[0] initial commit' (#116) from SobolevNS/2026-rff_mp:SobolevNS into develop
Reviewed-on: UNN/2026-rff_mp#116
2026-02-28 09:48:38 +00:00
5fc3c42694 Merge pull request '[0] initial commit' (#113) from rybakovaa/2026-rff_mp:rybakovaa into develop
Reviewed-on: UNN/2026-rff_mp#113
2026-02-28 09:48:25 +00:00
16808ba847 Merge pull request '[0] initial commit' (#119) from agafonovdm/2026-rff_mp:agafonovdm into develop
Reviewed-on: UNN/2026-rff_mp#119
2026-02-28 09:47:52 +00:00
e19c3b7841 Merge pull request '[0] initial commit' (#122) from larikovaaa/2026-rff_mp:LarikovaAA into develop
Reviewed-on: UNN/2026-rff_mp#122
2026-02-28 09:47:35 +00:00
88aa5a412f Merge pull request '[0] initial commit' (#126) from lukovnikovde/2026-rff_mp:LukovnikovDE into develop
Reviewed-on: UNN/2026-rff_mp#126
2026-02-28 09:47:18 +00:00
61f966e163 Merge pull request '[0] initial commit' (#125) from Ridge/2026-rff_mp:KorotkinSE into develop
Reviewed-on: UNN/2026-rff_mp#125
2026-02-28 09:46:55 +00:00
8c4322f768 Merge pull request '[0] initial commit' (#127) from SolovevDD/2026-rff_mp:SolovevDD into develop
Reviewed-on: UNN/2026-rff_mp#127
2026-02-28 09:46:41 +00:00
b85b706169 Merge pull request '[0] initial commit' (#106) from KuznetsovYuM/2026-rff_mp:KuznetsovYuM into develop
Reviewed-on: UNN/2026-rff_mp#106
2026-02-28 09:46:28 +00:00
8198cfb061 Merge pull request '[0] initial commit' (#102) from petryaninyas/2026-rff_mp:petryaninyas into develop
Reviewed-on: UNN/2026-rff_mp#102
2026-02-28 09:42:49 +00:00
7b7e8e93d4 Merge pull request '[0] initial commit' (#100) from MarkinAM/2026-rff_mp:MarkinAM into develop
Reviewed-on: UNN/2026-rff_mp#100
2026-02-28 09:42:19 +00:00
b83848116b new file 2026-02-28 11:40:24 +03:00
036c08c2d9 [0] initial commit 2026-02-28 08:25:52 +03:00
2bf7ca3c92 [0] initial commit 2026-02-28 01:11:43 +03:00
SolovevDD
089b6906b9 Добавил 1.1.Связаный список 2026-02-28 00:29:13 +03:00
786881334d [0] initial commit 2026-02-27 23:43:40 +03:00
SolovevDD
ddf8ef5105 [0] initial commit 2026-02-27 23:37:07 +03:00
ab854a04dd [0] initial commit 2026-02-27 23:32:09 +03:00
c121e51b1f [0] initial commit 2026-02-27 22:13:03 +03:00
3e175eb367 Добавил папку SavelevMI 2026-02-27 20:38:31 +03:00
3e5ee4a5a4 [0] initial commit 2026-02-27 20:36:00 +03:00
aa6fbb0692 [0] initial commit 2026-02-27 19:17:17 +03:00
shapovalovka
9eedcecf0c [0] initial commit 2026-02-27 19:14:53 +03:00
2204ca3dc8 [0] initial commit 2026-02-27 18:55:31 +03:00
764e6a3a2c [0] initial commit 2026-02-27 18:00:19 +03:00
ec48b13150 [0] initial commit 2026-02-27 12:00:34 +03:00
3cfd61e6cc [0] initial commit 2026-02-27 09:09:05 +03:00
groshevava
57c811ece4 [0] initial commit 2026-02-26 23:04:47 +00:00
0d86929b62 [0] initial commit 2026-02-26 23:02:00 +03:00
e442988725 [0] initial commit 2026-02-26 22:53:18 +03:00
1a041a4dac [0] initial commit 2026-02-26 21:00:34 +03:00
af2f607a3b [0] fix: correct file extension to .md 2026-02-26 19:50:20 +03:00
96532a99fb [0] initial commit 2026-02-26 19:44:37 +03:00
809f768703 [0] initial commit 2026-02-26 13:38:56 +03:00
154b9b8b65 [0] initial commit 2026-02-26 13:34:48 +03:00
aeb608a5d3 [0] initial commit 2026-02-25 19:02:50 +03:00
f541180fcf [0] initial commit 2026-02-25 17:16:19 +03:00
134b330145 [0] initial commit 2026-02-25 14:17:27 +03:00
SerKin0
7c9a1f8b51 [1] Создан файл для тестов файла связанных списков 2026-02-25 09:00:38 +03:00
SerKin0
1fd05fbf25 [1] Создание функции создания связанного списка по списку словарей create_linked_list 2026-02-25 09:00:04 +03:00
SerKin0
ae9b2a46b6 [1] Создание функции генерации узла create_node 2026-02-25 08:40:42 +03:00
8dc1d57252 [0] initial commit 2026-02-24 23:07:54 +03:00
MarkinAM
d7a13c9fe6 [0] initial commit 2026-02-24 17:57:48 +03:00
8124ef4551 [1] docs: data structures 2026-02-24 14:04:28 +00:00
8744999b03 Merge pull request '[1] raskatovia' (#99) from raskatovia/2026-rff_mp:raskatovia-2 into develop
Reviewed-on: UNN/2026-rff_mp#99
2026-02-24 12:17:16 +00:00
01f0e5dd88 Merge pull request '[0] initial commit' (#97) from pogodinda/2026-rff_mp:pogodinda into develop
Reviewed-on: UNN/2026-rff_mp#97
2026-02-24 12:16:53 +00:00
Иван
0c990ece48 [1] second submission 2026-02-23 13:49:00 +03:00
Иван
9af52f3f7b [429] initial 2026-02-23 13:38:33 +03:00
Иван
9e70450c50 [1] fix 2026-02-22 21:16:21 +03:00
Иван
a7323e3762 [0] initial commit 2026-02-22 21:07:02 +03:00
365f830e05 [0] initial commit 2026-02-22 12:45:20 +03:00
7fe5c11997 Обновить .gitignore 2026-02-21 11:45:45 +00:00
969b9ee469 Merge pull request '[0]sobininaas' (#93) from sobininaas/2026-rff_mp:sobininaas into develop
Reviewed-on: UNN/2026-rff_mp#93
2026-02-21 11:45:04 +00:00
0c6a8bd4db Обновить .gitignore 2026-02-21 11:44:54 +00:00
b849e3a7bc Merge branch 'develop' of http://31.128.43.79:3000/UNN/2026-rff_mp into develop 2026-02-21 14:29:21 +03:00
123
2e0eec1543 [0] 2026-02-21 14:28:51 +03:00
17fc44d83e fixed conflict 2026-02-21 14:28:06 +03:00
4b24d66ab7 Удалить 428.md 2026-02-21 11:24:46 +00:00
123
48d37c6f77 [0] initial commit 2026-02-21 14:23:21 +03:00
4a26e7aa89 Merge pull request '[0]shekurovAA' (#94) from shekurovaa/2026-rff_mp:shekurovAA into develop
Reviewed-on: UNN/2026-rff_mp#94
2026-02-21 11:15:41 +00:00
e0eb3ae13a Merge pull request '[0]' (#95) from fomichevks/2026-rff_mp:fomichevks into develop
Reviewed-on: UNN/2026-rff_mp#95
2026-02-21 11:15:29 +00:00
f983a6fa1d [0] 2026-02-21 14:13:16 +03:00
Смирнов Андрей Д
356e4b53dd [0] initial commit 2026-02-21 14:11:17 +03:00
b7cea24df4 Merge pull request '[0] initial commit' (#89) from smirnovad/2026-rff_mp:smirnovad into develop
Reviewed-on: UNN/2026-rff_mp#89
2026-02-21 11:05:41 +00:00
8221562750 Merge pull request '[0] initial commit' (#88) from semyanovra/2026-rff_mp:semyanovra into develop
Reviewed-on: UNN/2026-rff_mp#88
2026-02-21 11:05:32 +00:00
123
789d8ef3bb [0] 2026-02-21 14:04:51 +03:00
Смирнов Андрей Д
6e433a36ae [0] initial commit 2026-02-21 14:04:28 +03:00
123
a50fd0bfc1 [0] 2026-02-21 14:03:15 +03:00
Семьянов Руслан А
de2b98bc01 [0] initial commit 2026-02-21 13:58:46 +03:00
c53b093c38 Merge pull request '[0] initial commit' (#87) from kornevma/2026-rff_mp:kornevma into develop
Reviewed-on: UNN/2026-rff_mp#87
2026-02-21 10:55:06 +00:00
dd3b126d62 Merge pull request '[0] initial commit' (#85) from agapovads/2026-rff_mp:agapovads into develop
Reviewed-on: UNN/2026-rff_mp#85
2026-02-21 10:53:01 +00:00
048b211945 Merge pull request '[0] initial commit' (#84) from nehoroshevaa/2026-rff_mp:nehoroshevaa into develop
Reviewed-on: UNN/2026-rff_mp#84
2026-02-21 10:51:40 +00:00
6d05295507 Merge pull request '[0] initial commit' (#81) from anikinvd/2026-rff_mp:anikinvd into develop
Reviewed-on: UNN/2026-rff_mp#81
2026-02-21 10:50:19 +00:00
55d8ed29c6 Merge pull request '[0] initial commit' (#80) from meosyam/2026-rff_mp:meosyam into develop
Reviewed-on: UNN/2026-rff_mp#80
2026-02-21 10:49:39 +00:00
af2d62a446 Merge pull request '[0] initial commit' (#79) from novikovsd/2026-rff_mp:novikovsd into develop
Reviewed-on: UNN/2026-rff_mp#79
2026-02-21 10:49:22 +00:00
fe5a8bea89 Merge pull request '[0] initial commit' (#77) from duznb/2026-rff_mp:duznb into develop
Reviewed-on: UNN/2026-rff_mp#77
2026-02-21 10:49:12 +00:00
Волков Илья М
8fb5738b50 [0] initial commit 2026-02-21 13:48:49 +03:00
b4b3140603 Merge pull request '[0] initial commit' (#75) from volkovim/2026-rff_mp:volkovim into develop
Reviewed-on: UNN/2026-rff_mp#75
2026-02-21 10:39:17 +00:00
Новиков Семён Д
90503c7b92 [0] initial commit 2026-02-21 13:39:09 +03:00
Аникин Владислав Д
bcde039ddd [0] initial commit 2026-02-21 13:38:46 +03:00
ddc6d9b877 [0] initial commit 2026-02-21 13:36:14 +03:00
e1e08990e0 [0] initial commit 2026-02-21 13:36:01 +03:00
Агапова Дарина С
fe50036baf [0] initial commit 2026-02-21 13:35:45 +03:00
123
8f2e46907f [0] initial commit 2026-02-21 13:35:11 +03:00
Шекуров Алексей А
afa3504609 [0] initial commit 2026-02-21 13:34:52 +03:00
Корнев Макар А
ccb7c7a5da [0] initial commit 2026-02-21 13:32:10 +03:00
Волков Илья М
6ef4820d9e [0] initial commit 2026-02-21 13:21:07 +03:00
c3131ce0f6 Merge pull request '[0] initial commit' (#74) from shahovaa/2026-rff_mp:shahovaa into develop
Reviewed-on: UNN/2026-rff_mp#74
2026-02-21 10:04:35 +00:00
8a523c9afb Merge pull request '[0] initial commit' (#72) from DerbenevRY/2026-rff_mp:DerbenevRY into develop
Reviewed-on: UNN/2026-rff_mp#72
2026-02-21 09:59:00 +00:00
e8ea43f9b3 [0] initial commit 2026-02-21 12:51:56 +03:00
Alex
57c8ef048f Remove .DS_Store and add to gitignore 2026-02-21 12:45:34 +03:00
c774f9182a Merge pull request '[0] initial commit' (#70) from volkovva/2026-rff_mp:VolkovVA into develop
Reviewed-on: UNN/2026-rff_mp#70
2026-02-21 09:42:58 +00:00
194d822b62 [0] initial commit 2026-02-21 11:27:54 +03:00
Alex
589787851b [0] initial commit 2026-02-21 11:09:51 +03:00
b34b2b76c8 Merge pull request '[0] initial commit' (#56) from soldatkinao/2026-rff_mp:soldatkinao into develop
Reviewed-on: UNN/2026-rff_mp#56
2026-02-21 05:38:35 +00:00
46f73eaa47 Merge pull request '[0] initial commit' (#57) from konnovaea/2026-rff_mp:konnovaea into develop
Reviewed-on: UNN/2026-rff_mp#57
2026-02-21 05:38:16 +00:00
5eab591f1a Merge pull request '[0] initial commit' (#58) from chizhikovasm/2026-rff_mp:chizhikovaSM into develop
Reviewed-on: UNN/2026-rff_mp#58
2026-02-21 05:38:07 +00:00
768a06fbb6 Merge pull request '[0] initial commit' (#59) from krasnovia/2026-rff_mp:krasnovia into develop
Reviewed-on: UNN/2026-rff_mp#59
2026-02-21 05:37:59 +00:00
141bb2bbb5 Merge pull request '[0] initial commit' (#60) from zaharoves/2026-rff_mp:zaharoves into develop
Reviewed-on: UNN/2026-rff_mp#60
2026-02-21 05:37:50 +00:00
f7b4f75488 Merge pull request '[0] initial commit' (#61) from zverevem/2026-rff_mp:zverevem into develop
Reviewed-on: UNN/2026-rff_mp#61
2026-02-21 05:37:42 +00:00
802b72d10b Merge pull request '[0] initial commit' (#62) from shalovsa/2026-rff_mp:shalovsa into develop
Reviewed-on: UNN/2026-rff_mp#62
2026-02-21 05:37:33 +00:00
0cd1012949 Merge pull request '[0] initial commit' (#63) from zelentsovav/2026-rff_mp:ZelentsovAV into develop
Reviewed-on: UNN/2026-rff_mp#63
2026-02-21 05:37:24 +00:00
6b2f019b11 Merge pull request '[0] initial commit' (#64) from yanyaevaa/2026-rff_mp:YanyaevAA into develop
Reviewed-on: UNN/2026-rff_mp#64
2026-02-21 05:37:16 +00:00
5964cc81ab Merge pull request '[0] initial commit' (#65) from musinaa/2026-rff_mp:MusinAA into develop
Reviewed-on: UNN/2026-rff_mp#65
2026-02-21 05:37:08 +00:00
9f395a7b9a Merge pull request '[0] initial commit' (#66) from Andrey/2026-rff_mp:YaroslavtsevAS into develop
Reviewed-on: UNN/2026-rff_mp#66
2026-02-21 05:36:48 +00:00
362b487266 Merge branch 'develop' into YaroslavtsevAS 2026-02-21 05:36:41 +00:00
8a4eb2ab7b Merge pull request '[0] initial commit' (#67) from solovevds/2026-rff_mp:SolovevDS into develop
Reviewed-on: UNN/2026-rff_mp#67
2026-02-21 05:36:32 +00:00
cc5764f86a Merge pull request '[0] initial commit' (#68) from stepinim/2026-rff_mp:stepinim into develop
Reviewed-on: UNN/2026-rff_mp#68
2026-02-21 05:36:02 +00:00
c276d52949 Merge pull request '[0] initial commit' (#69) from MashinDD/2026-rff_mp:MashinDD into develop
Reviewed-on: UNN/2026-rff_mp#69
2026-02-21 05:35:47 +00:00
a40c5f579a [0] initial commit 2026-02-20 23:36:56 +03:00
2ea1b50bc7 [0] initial commit 2026-02-20 22:50:08 +03:00
d5450e0063 [0] initial commit 2026-02-20 22:32:31 +03:00
b35fa6725b [0] initial commit 2026-02-20 21:28:01 +03:00
de62717491 [0] initial commit 2026-02-20 19:59:41 +03:00
902ad5ef53 [0] initial commit 2026-02-20 19:58:35 +03:00
oSTEVEo
343a06519a [0] initial commit 2026-02-20 19:58:28 +03:00
a2621ad508 [0] initial commit 2026-02-20 18:37:49 +03:00
95f3cd28df [0] initial commit' 2026-02-20 18:25:52 +03:00
57adafbebd [0] initial commit 2026-02-20 18:23:20 +03:00
shalovsa
b881e05410 [0] initial commit 2026-02-20 18:22:42 +03:00
d33fd62603 [0] initial commit 2026-02-20 16:55:58 +03:00
e5733fd15d [0] initial commit 2026-02-19 16:52:52 +03:00
8dff4985b9 [0] initial commit 2026-02-19 12:46:18 +03:00
SerKin0
9cf5ffa339 [0] Добавление main.py 2026-02-14 12:29:33 +03:00
SerKin0
568d2cbf23 Добавлен main.py 2026-02-14 11:35:41 +03:00
aca0eb0c84 Добавлен файл группы 427 для Погодин 2026-02-14 00:56:21 +03:00
1943 changed files with 203690 additions and 3 deletions

1
.gitignore vendored
View File

@ -7,6 +7,7 @@ __pycache__/
# C extensions
*.so
.DS_Store
# Distribution / packaging
.Python
build/

View File

@ -0,0 +1,6 @@
<component name="InspectionProjectProfileManager">
<settings>
<option name="USE_PROJECT_PROFILE" value="false" />
<version value="1.0" />
</settings>
</component>

View File

@ -0,0 +1,14 @@
<?xml version="1.0" encoding="UTF-8"?>
<module type="PYTHON_MODULE" version="4">
<component name="NewModuleRootManager">
<content url="file://$MODULE_DIR$">
<excludeFolder url="file://$MODULE_DIR$/venv" />
</content>
<orderEntry type="inheritedJdk" />
<orderEntry type="sourceFolder" forTests="false" />
</component>
<component name="PyDocumentationSettings">
<option name="format" value="PLAIN" />
<option name="myDocStringFormat" value="Plain" />
</component>
</module>

View File

@ -0,0 +1,4 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ProjectRootManager" version="2" project-jdk-name="Python 3.11 (maze_project_submission) (2)" project-jdk-type="Python SDK" />
</project>

View File

@ -0,0 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ProjectModuleManager">
<modules>
<module fileurl="file://$PROJECT_DIR$/.idea/maze_project_submission.iml" filepath="$PROJECT_DIR$/.idea/maze_project_submission.iml" />
</modules>
</component>
</project>

View File

@ -0,0 +1,42 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="AutoImportSettings">
<option name="autoReloadType" value="SELECTIVE" />
</component>
<component name="ChangeListManager">
<list default="true" id="a6ff989d-c5f6-4522-8b0a-933849f2d044" name="Changes" comment="" />
<option name="SHOW_DIALOG" value="false" />
<option name="HIGHLIGHT_CONFLICTS" value="true" />
<option name="HIGHLIGHT_NON_ACTIVE_CHANGELIST" value="false" />
<option name="LAST_RESOLUTION" value="IGNORE" />
</component>
<component name="MarkdownSettingsMigration">
<option name="stateVersion" value="1" />
</component>
<component name="ProjectColorInfo"><![CDATA[{
"associatedIndex": 2
}]]></component>
<component name="ProjectId" id="3EB20Mq0B865MSq8Kkl2evaRIZW" />
<component name="ProjectViewState">
<option name="hideEmptyMiddlePackages" value="true" />
<option name="showLibraryContents" value="true" />
</component>
<component name="PropertiesComponent"><![CDATA[{
"keyToString": {
"RunOnceActivity.OpenProjectViewOnStart": "true",
"RunOnceActivity.ShowReadmeOnStart": "true",
"last_opened_file_path": "C:/Users/vaz21/Downloads/Task 2 GLOBAL/maze_project_submission"
}
}]]></component>
<component name="SpellCheckerSettings" RuntimeDictionaries="0" Folders="0" CustomDictionaries="0" DefaultDictionary="application-level" UseSingleDictionary="true" transferred="true" />
<component name="TaskManager">
<task active="true" id="Default" summary="Default task">
<changelist id="a6ff989d-c5f6-4522-8b0a-933849f2d044" name="Changes" comment="" />
<created>1779637417749</created>
<option name="number" value="Default" />
<option name="presentableId" value="Default" />
<updated>1779637417749</updated>
</task>
<servers />
</component>
</project>

24
BolonkinNM/README.md Normal file
View File

@ -0,0 +1,24 @@
# Maze Solver Project
ООП-проект для поиска выхода из лабиринта с паттернами:
- Builder
- Strategy
- Observer
- Command
## Запуск
```bash
python main.py
```
## Эксперименты
```bash
python experiment.py
```
Результаты сохраняются в папку `experiment_results/`.
## Требования
```bash
pip install -r requirements.txt
```

View File

View File

@ -0,0 +1,7 @@
from abc import ABC, abstractmethod
class MazeBuilder(ABC):
@abstractmethod
def buildFromFile(self, filename):
raise NotImplementedError

View File

@ -0,0 +1,52 @@
from core.cell import Cell
from core.maze import Maze
from builders.maze_builder import MazeBuilder
class TextFileMazeBuilder(MazeBuilder):
def buildFromFile(self, filename):
with open(filename, "r", encoding="utf-8") as f:
lines = [line.rstrip("\n") for line in f]
if not lines:
raise ValueError("Maze file is empty")
width = max(len(line) for line in lines)
height = len(lines)
cells = []
startCell = None
exitCell = None
for y, line in enumerate(lines):
row = []
for x in range(width):
ch = line[x] if x < len(line) else "#"
if ch == "#":
cell = Cell(x, y, isWall=True)
elif ch == "S":
if startCell is not None:
raise ValueError("Multiple start cells found")
cell = Cell(x, y, isWall=False, isStart=True)
startCell = cell
elif ch == "E":
if exitCell is not None:
raise ValueError("Multiple exit cells found")
cell = Cell(x, y, isWall=False, isExit=True)
exitCell = cell
elif ch in (" ", "."):
cell = Cell(x, y, isWall=False)
elif ch.isdigit():
cell = Cell(x, y, isWall=False, weight=max(1, int(ch)))
else:
raise ValueError(f"Unsupported symbol '{ch}' at ({x}, {y})")
row.append(cell)
cells.append(row)
if startCell is None:
raise ValueError("Start cell 'S' not found")
if exitCell is None:
raise ValueError("Exit cell 'E' not found")
return Maze(cells, width, height, startCell, exitCell)

View File

View File

@ -0,0 +1,11 @@
from abc import ABC, abstractmethod
class Command(ABC):
@abstractmethod
def execute(self):
raise NotImplementedError
@abstractmethod
def undo(self):
raise NotImplementedError

View File

@ -0,0 +1,37 @@
from commands.command import Command
class MoveCommand(Command):
DIRECTION_TO_DELTA = {
"W": (0, -1),
"A": (-1, 0),
"S": (0, 1),
"D": (1, 0),
}
def __init__(self, player, maze, direction):
self.player = player
self.maze = maze
self.direction = direction.upper()
self.previousCell = None
def execute(self):
if self.direction not in self.DIRECTION_TO_DELTA:
return False
dx, dy = self.DIRECTION_TO_DELTA[self.direction]
current = self.player.currentCell
new_cell = self.maze.getCell(current.x + dx, current.y + dy)
if new_cell is None or not new_cell.isPassable():
return False
self.previousCell = current
self.player.setCell(new_cell)
return True
def undo(self):
if self.previousCell is None:
return False
self.player.setCell(self.previousCell)
return True

View File

View File

@ -0,0 +1,30 @@
from commands.move_command import MoveCommand
class GameController:
def __init__(self, maze, player, view):
self.maze = maze
self.player = player
self.view = view
self.history = []
def move(self, direction):
command = MoveCommand(self.player, self.maze, direction)
if command.execute():
self.history.append(command)
self.view.update({"type": "move", "direction": direction})
self.view.render(self.maze, player_position=self.player.currentCell)
return True
print("Cannot move there")
return False
def undo(self):
if not self.history:
print("Nothing to undo")
return False
command = self.history.pop()
if command.undo():
self.view.update({"type": "undo"})
self.view.render(self.maze, player_position=self.player.currentCell)
return True
return False

View File

26
BolonkinNM/core/cell.py Normal file
View File

@ -0,0 +1,26 @@
from dataclasses import dataclass
@dataclass
class Cell:
x: int
y: int
isWall: bool = False
isStart: bool = False
isExit: bool = False
weight: int = 1
def isPassable(self):
return not self.isWall
def __repr__(self):
parts = [f"Cell({self.x}, {self.y}"]
if self.isWall:
parts.append("WALL")
if self.isStart:
parts.append("START")
if self.isExit:
parts.append("EXIT")
if self.weight != 1:
parts.append(f"w={self.weight}")
return ", ".join(parts) + ")"

49
BolonkinNM/core/maze.py Normal file
View File

@ -0,0 +1,49 @@
class Maze:
def __init__(self, cells, width, height, startCell=None, exitCell=None):
self.cells = cells
self.width = width
self.height = height
self.startCell = startCell
self.exitCell = exitCell
def getCell(self, x, y):
if 0 <= x < self.width and 0 <= y < self.height:
return self.cells[y][x]
return None
def getNeighbors(self, cell):
neighbors = []
for dx, dy in ((0, -1), (0, 1), (-1, 0), (1, 0)):
nx, ny = cell.x + dx, cell.y + dy
neighbor = self.getCell(nx, ny)
if neighbor is not None and neighbor.isPassable():
neighbors.append(neighbor)
return neighbors
def render_lines(self, player_position=None, path=None):
path_set = {(c.x, c.y) for c in path} if path else set()
player_pos = None if player_position is None else (player_position.x, player_position.y)
lines = []
for y in range(self.height):
row = []
for x in range(self.width):
cell = self.cells[y][x]
if player_pos == (x, y):
row.append("P")
elif cell.isStart:
row.append("S")
elif cell.isExit:
row.append("E")
elif cell.isWall:
row.append("#")
elif (x, y) in path_set:
row.append("*")
elif cell.weight > 1:
row.append(str(cell.weight))
else:
row.append(" ")
lines.append("".join(row))
return lines
def render(self, player_position=None, path=None):
return "\n".join(self.render_lines(player_position=player_position, path=path))

View File

@ -0,0 +1,6 @@
class Player:
def __init__(self, currentCell):
self.currentCell = currentCell
def setCell(self, cell):
self.currentCell = cell

View File

@ -0,0 +1,11 @@
from dataclasses import dataclass, field
@dataclass
class SearchStats:
timeMs: float
visitedCells: int
pathLength: int
path: list = field(default_factory=list)
found: bool = False
algorithm: str = ""

View File

@ -0,0 +1 @@
Place report files and experiment outputs here.

249
BolonkinNM/docs/report.md Normal file
View File

@ -0,0 +1,249 @@
# Отчёт по работе «Поиск выхода из лабиринта»
## 1. Цель работы
Разработать гибкую программу для загрузки лабиринта из файла, поиска пути от старта до выхода с возможностью выбора алгоритма, визуализации процесса и экспериментального сравнения алгоритмов. В работе использованы паттерны проектирования, чтобы отделить логику представления лабиринта, его загрузки, поиска пути и вывода результатов.
## 2. Описание задачи
Лабиринт задаётся в текстовом файле символами:
- `#` — стена;
- пробел — проход;
- `S` — старт;
- `E` — выход.
Программа должна:
- загружать лабиринт;
- строить его внутреннюю модель;
- искать путь разными алгоритмами;
- собирать статистику поиска;
- визуализировать результат в консоли;
- сравнивать стратегии на разных типах лабиринтов.
## 3. Выбранные паттерны проектирования
### 3.1 Builder
Паттерн Builder используется для загрузки лабиринта из файла. Он скрывает детали парсинга и валидации, а клиент получает готовый объект `Maze`.
Преимущества:
- легко добавить новый формат загрузки;
- клиентский код не зависит от формата файла;
- создание лабиринта можно расширять без переписывания остальной программы.
### 3.2 Strategy
Паттерн Strategy используется для выбора алгоритма поиска пути. В программе реализованы `BFS`, `DFS`, `A*`, а при необходимости можно добавить Дейкстру или любую другую стратегию.
Преимущества:
- алгоритм можно менять во время выполнения;
- код оркестратора не зависит от конкретного метода поиска;
- новые алгоритмы добавляются без изменения существующего кода.
### 3.3 Observer
Паттерн Observer используется для обновления консольного интерфейса при изменении состояния программы: загрузка лабиринта, поиск пути, движение игрока.
Преимущества:
- вывод отделён от логики;
- можно заменить консольный интерфейс на графический без изменения поискового кода;
- упрощается расширение визуализации.
### 3.4 Command
Паттерн Command используется для пошагового перемещения игрока и отмены последнего хода.
Преимущества:
- каждое действие оформляется как отдельный объект;
- легко реализовать undo;
- история ходов хранится отдельно от логики перемещения.
## 4. Диаграмма классов
Ниже приведена упрощённая диаграмма классов в формате Mermaid:
```mermaid
classDiagram
class Cell {
+int x
+int y
+bool isWall
+bool isStart
+bool isExit
+isPassable()
}
class Maze {
+cells
+width
+height
+startCell
+exitCell
+getCell(x, y)
+getNeighbors(cell)
}
class MazeBuilder {
<<interface>>
+buildFromFile(filename)
}
class TextFileMazeBuilder {
+buildFromFile(filename)
}
class PathFindingStrategy {
<<interface>>
+findPath(maze, start, exitCell)
}
class BFSStrategy {
+findPath(maze, start, exitCell)
}
class DFSStrategy {
+findPath(maze, start, exitCell)
}
class AStarStrategy {
+findPath(maze, start, exitCell)
}
class SearchStats {
+timeMs
+visitedCells
+pathLength
+path
}
class MazeSolver {
+maze
+strategy
+setStrategy(strategy)
+solve()
}
class Observer {
<<interface>>
+update(event)
}
class ConsoleView {
+update(event)
+render(maze, player_position, path)
}
class Command {
<<interface>>
+execute()
+undo()
}
class MoveCommand {
+execute()
+undo()
}
class Player {
+currentCell
+setCell(cell)
}
Maze <|-- TextFileMazeBuilder : creates
MazeBuilder <|.. TextFileMazeBuilder
PathFindingStrategy <|.. BFSStrategy
PathFindingStrategy <|.. DFSStrategy
PathFindingStrategy <|.. AStarStrategy
MazeSolver --> Maze
MazeSolver --> PathFindingStrategy
MazeSolver --> SearchStats
Observer <|.. ConsoleView
Command <|.. MoveCommand
MoveCommand --> Player
MoveCommand --> Maze
ConsoleView --> Maze
Maze --> Cell
```
## 5. Ключевые классы и их роль
### Cell
Хранит координаты клетки и её тип. Позволяет быстро проверять, является ли клетка проходимой.
### Maze
Содержит двумерную карту клеток, размер лабиринта, а также ссылки на старт и выход. Даёт доступ к соседним клеткам по четырём направлениям.
### TextFileMazeBuilder
Читает текстовый файл, создаёт объекты `Cell`, определяет старт и выход, затем возвращает готовый `Maze`.
### BFSStrategy
Ищет кратчайший путь по числу шагов. Подходит для случая, когда все переходы одинаковой стоимости.
### DFSStrategy
Быстро исследует пространство, но не гарантирует кратчайший путь. Полезен как сравнительный алгоритм.
### AStarStrategy
Использует эвристику Манхэттенского расстояния. Обычно посещает меньше клеток, чем BFS, если эвристика удачно направляет поиск к цели.
### MazeSolver
Оркестратор, который хранит лабиринт и текущую стратегию. Вызывает поиск, измеряет время и собирает статистику.
### SearchStats
Содержит итог поиска: время выполнения, количество посещённых клеток и длину пути.
### ConsoleView
Реализует наблюдателя и умеет выводить лабиринт и найденный путь в консоль.
### MoveCommand
Оформляет ход игрока как объект-команду. Поддерживает отмену последнего перемещения.
## 6. Экспериментальная часть
### 6.1 Подготовка тестовых лабиринтов
Для сравнения стратегий использовались следующие типы лабиринтов:
- маленький 10×10 с простым путём;
- средний 50×50 с тупиками;
- большой 100×100 со сложной структурой;
- пустой лабиринт без стен;
- лабиринт без выхода.
### 6.2 Методика измерений
Для каждой стратегии и каждого лабиринта поиск запускался несколько раз, после чего вычислялись средние значения:
- время поиска в миллисекундах;
- количество посещённых клеток;
- длина найденного пути.
Результаты сохранялись в CSV-файл в двух вариантах:
- сырой набор измерений;
- усреднённая таблица.
## 7. Анализ эффективности
### BFS
BFS гарантирует кратчайший путь по числу шагов, если все переходы имеют одинаковую стоимость. На простых и пустых лабиринтах работает стабильно и предсказуемо. Минус — может посещать много клеток, особенно на больших лабиринтах.
### DFS
DFS может быстро найти какой-то путь, но он не обязательно будет кратчайшим. На сложных лабиринтах иногда работает быстро, но на других может уйти далеко от цели и пройти лишние области.
### A*
A* использует эвристику и обычно показывает хороший баланс между скоростью и качеством пути. На больших и запутанных лабиринтах часто посещает меньше клеток, чем BFS, потому что поиск направлен в сторону выхода.
### Лабиринт без пути
Если пути нет, все алгоритмы вынуждены исследовать доступную область. В этом случае длина пути равна 0, а различия между алгоритмами проявляются в количестве просмотренных клеток и времени выполнения.
### Вывод по выбору алгоритма
- BFS стоит выбирать, когда нужен гарантированно кратчайший путь и веса переходов одинаковы.
- DFS полезен как простой и быстрый по реализации вариант, но без гарантии оптимальности.
- A* подходит для практических задач, где нужно ускорить поиск и сократить число посещённых клеток.
- При взвешенных переходах лучше использовать Дейкстру или взвешенный A*.
## 8. Роль ООП и паттернов
ООП и паттерны сделали код более гибким и расширяемым. Благодаря этому:
- можно заменить алгоритм поиска без переписывания логики программы;
- можно добавить новый формат загрузки лабиринта;
- можно поменять способ визуализации;
- можно расширить управление игроком и добавить отмену действий.
Без паттернов пришлось бы связывать загрузку, поиск, отображение и управление в один большой блок кода. Это усложнило бы отладку и дальнейшие изменения.
## 9. Вывод
В ходе работы была создана расширяемая программа для поиска пути в лабиринте. Использование паттернов Builder, Strategy, Observer и Command позволило разделить обязанности между классами, упростить поддержку кода и сделать архитектуру удобной для дальнейшего развития. Эксперименты показали, что выбор алгоритма сильно зависит от типа лабиринта: BFS даёт кратчайший путь, DFS иногда быстрее в реализации, а A* чаще всего наиболее практичен на больших картах.
## 10. Приложения
- Листинги ключевых классов.
- CSV-файлы с результатами экспериментов.
- Графики сравнений.
- Файлы с тестовыми лабиринтами.

225
BolonkinNM/experiment.py Normal file
View File

@ -0,0 +1,225 @@
from pathlib import Path
from statistics import mean
import csv
import random
import matplotlib.pyplot as plt
from core.cell import Cell
from core.maze import Maze
from solver.maze_solver import MazeSolver
from strategies.astar_strategy import AStarStrategy
from strategies.bfs_strategy import BFSStrategy
from strategies.dfs_strategy import DFSStrategy
from strategies.dijkstra_strategy import DijkstraStrategy
BASE_DIR = Path(__file__).resolve().parent
OUT_DIR = BASE_DIR / "experiment_results"
def build_maze_from_symbols(lines):
height = len(lines)
width = max(len(line) for line in lines)
cells = []
start = None
exit_cell = None
for y, line in enumerate(lines):
row = []
for x in range(width):
ch = line[x] if x < len(line) else "#"
if ch == "#":
cell = Cell(x, y, isWall=True)
elif ch == "S":
cell = Cell(x, y, isWall=False, isStart=True)
start = cell
elif ch == "E":
cell = Cell(x, y, isWall=False, isExit=True)
exit_cell = cell
elif ch == " " or ch == ".":
cell = Cell(x, y, isWall=False)
elif ch.isdigit():
cell = Cell(x, y, isWall=False, weight=int(ch))
else:
raise ValueError(f"Unknown symbol '{ch}' at {x},{y}")
row.append(cell)
cells.append(row)
return Maze(cells, width, height, start, exit_cell)
def generate_empty_maze(width, height):
lines = [" " * width for _ in range(height)]
lines = [list(row) for row in lines]
lines[1][1] = "S"
lines[height - 2][width - 2] = "E"
return build_maze_from_symbols(["".join(row) for row in lines])
def generate_simple_maze(width, height):
grid = [["#" for _ in range(width)] for _ in range(height)]
for x in range(1, width - 1):
grid[1][x] = " "
for y in range(1, height - 1):
grid[y][width - 2] = " "
grid[1][1] = "S"
grid[height - 2][width - 2] = "E"
return build_maze_from_symbols(["".join(row) for row in grid])
def generate_branching_maze(width, height, seed=42, wall_density=0.30):
rng = random.Random(seed)
grid = [["#" for _ in range(width)] for _ in range(height)]
x, y = 1, 1
grid[y][x] = "S"
while (x, y) != (width - 2, height - 2):
candidates = []
for dx, dy in [(1, 0), (0, 1)]:
nx, ny = x + dx, y + dy
if 1 <= nx < width - 1 and 1 <= ny < height - 1:
candidates.append((nx, ny))
if not candidates:
break
x, y = rng.choice(candidates)
grid[y][x] = " "
grid[height - 2][width - 2] = "E"
# carve extra corridors and dead ends
for yy in range(1, height - 1):
for xx in range(1, width - 1):
if grid[yy][xx] == "#" and rng.random() > wall_density:
grid[yy][xx] = " "
grid[1][1] = "S"
grid[height - 2][width - 2] = "E"
return build_maze_from_symbols(["".join(row) for row in grid])
def generate_no_path_maze(width, height):
grid = [[" " for _ in range(width)] for _ in range(height)]
for x in range(width):
grid[height // 2][x] = "#"
grid[1][1] = "S"
grid[height - 2][width - 2] = "E"
return build_maze_from_symbols(["".join(row) for row in grid])
def generate_weighted_maze(width, height, seed=123):
rng = random.Random(seed)
grid = [[" " for _ in range(width)] for _ in range(height)]
for y in range(height):
for x in range(width):
r = rng.random()
if r < 0.12:
grid[y][x] = "#"
elif r < 0.25:
grid[y][x] = "3"
elif r < 0.40:
grid[y][x] = "2"
else:
grid[y][x] = "1"
# ensure path-ish
for x in range(width):
grid[1][x] = "1"
for y in range(1, height):
grid[y][width - 2] = "1"
grid[1][1] = "S"
grid[height - 2][width - 2] = "E"
return build_maze_from_symbols(["".join(row) for row in grid])
def bench_one_maze(maze_name, maze, strategies, repeats=5):
summary_rows = []
raw_rows = []
for strategy_name, strategy_factory in strategies:
times, visiteds, lengths = [], [], []
for run in range(1, repeats + 1):
solver = MazeSolver(maze)
solver.setStrategy(strategy_factory())
stats = solver.solve()
raw_rows.append([maze_name, strategy_name, run, f"{stats.timeMs:.6f}", stats.visitedCells, stats.pathLength])
times.append(stats.timeMs)
visiteds.append(stats.visitedCells)
lengths.append(stats.pathLength)
summary_rows.append([maze_name, strategy_name, f"{mean(times):.6f}", f"{mean(visiteds):.2f}", f"{mean(lengths):.2f}", repeats])
return summary_rows, raw_rows
def save_csv(path, rows):
with open(path, "w", newline="", encoding="utf-8") as f:
csv.writer(f).writerows(rows)
def plot_summary(summary_rows):
by_maze = {}
for row in summary_rows[1:]:
maze_name, strategy, avg_time, avg_visited, avg_len, runs = row
by_maze.setdefault(maze_name, []).append((strategy, float(avg_time), float(avg_visited), float(avg_len)))
for maze_name, items in by_maze.items():
items.sort(key=lambda t: t[0])
strategies = [i[0] for i in items]
x = list(range(len(strategies)))
plt.figure(figsize=(8, 4))
plt.bar(x, [i[1] for i in items])
plt.xticks(x, strategies)
plt.ylabel("ms")
plt.title(f"{maze_name} — avg time")
plt.tight_layout()
plt.savefig(OUT_DIR / f"{maze_name}_time.png", dpi=150)
plt.close()
plt.figure(figsize=(8, 4))
plt.bar(x, [i[2] for i in items])
plt.xticks(x, strategies)
plt.ylabel("cells")
plt.title(f"{maze_name} — visited cells")
plt.tight_layout()
plt.savefig(OUT_DIR / f"{maze_name}_visited.png", dpi=150)
plt.close()
plt.figure(figsize=(8, 4))
plt.bar(x, [i[3] for i in items])
plt.xticks(x, strategies)
plt.ylabel("cells")
plt.title(f"{maze_name} — path length")
plt.tight_layout()
plt.savefig(OUT_DIR / f"{maze_name}_length.png", dpi=150)
plt.close()
def main():
OUT_DIR.mkdir(exist_ok=True)
strategies = [
("BFS", BFSStrategy),
("DFS", DFSStrategy),
("A*", AStarStrategy),
("Dijkstra", DijkstraStrategy),
]
mazes = [
("small_10x10", generate_simple_maze(10, 10)),
("medium_50x50", generate_branching_maze(50, 50)),
("large_100x100", generate_branching_maze(100, 100, seed=99, wall_density=0.35)),
("empty_30x30", generate_empty_maze(30, 30)),
("no_path_30x30", generate_no_path_maze(30, 30)),
("weighted_30x30", generate_weighted_maze(30, 30)),
]
summary = [["maze", "strategy", "avg_time_ms", "avg_visited_cells", "avg_path_length", "runs"]]
raw = [["maze", "strategy", "run", "time_ms", "visited_cells", "path_length"]]
for maze_name, maze in mazes:
s_rows, r_rows = bench_one_maze(maze_name, maze, strategies, repeats=5)
summary.extend(s_rows)
raw.extend(r_rows)
save_csv(OUT_DIR / "summary.csv", summary)
save_csv(OUT_DIR / "raw.csv", raw)
plot_summary(summary)
print("Saved to", OUT_DIR.resolve())
if __name__ == "__main__":
main()

Binary file not shown.

After

Width:  |  Height:  |  Size: 24 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 20 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 25 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 22 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 22 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 20 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 24 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 20 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 19 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 20 KiB

View File

@ -0,0 +1,121 @@
maze,strategy,run,time_ms,visited_cells,path_length
small_10x10,BFS,1,0.044300,15,15
small_10x10,BFS,2,0.022800,15,15
small_10x10,BFS,3,0.020400,15,15
small_10x10,BFS,4,0.020300,15,15
small_10x10,BFS,5,0.018700,15,15
small_10x10,DFS,1,0.031200,15,15
small_10x10,DFS,2,0.022000,15,15
small_10x10,DFS,3,0.021200,15,15
small_10x10,DFS,4,0.020800,15,15
small_10x10,DFS,5,0.020500,15,15
small_10x10,A*,1,0.048900,15,15
small_10x10,A*,2,0.034700,15,15
small_10x10,A*,3,0.029400,15,15
small_10x10,A*,4,0.029100,15,15
small_10x10,A*,5,0.029300,15,15
small_10x10,Dijkstra,1,0.037900,15,15
small_10x10,Dijkstra,2,0.028500,15,15
small_10x10,Dijkstra,3,0.026800,15,15
small_10x10,Dijkstra,4,0.026400,15,15
small_10x10,Dijkstra,5,0.026700,15,15
medium_50x50,BFS,1,2.105800,1579,95
medium_50x50,BFS,2,1.928700,1579,95
medium_50x50,BFS,3,1.969500,1579,95
medium_50x50,BFS,4,1.938800,1579,95
medium_50x50,BFS,5,1.943600,1579,95
medium_50x50,DFS,1,1.927300,1277,647
medium_50x50,DFS,2,1.856300,1277,647
medium_50x50,DFS,3,1.890100,1277,647
medium_50x50,DFS,4,1.868000,1277,647
medium_50x50,DFS,5,1.865500,1277,647
medium_50x50,A*,1,2.359000,927,95
medium_50x50,A*,2,2.193700,927,95
medium_50x50,A*,3,2.178400,927,95
medium_50x50,A*,4,2.181800,927,95
medium_50x50,A*,5,2.174500,927,95
medium_50x50,Dijkstra,1,3.534700,1579,95
medium_50x50,Dijkstra,2,3.435500,1579,95
medium_50x50,Dijkstra,3,3.457600,1579,95
medium_50x50,Dijkstra,4,3.417300,1579,95
medium_50x50,Dijkstra,5,3.538000,1579,95
large_100x100,BFS,1,8.624100,5566,195
large_100x100,BFS,2,7.706900,5566,195
large_100x100,BFS,3,9.723300,5566,195
large_100x100,BFS,4,7.585700,5566,195
large_100x100,BFS,5,8.031300,5566,195
large_100x100,DFS,1,5.512400,3543,1531
large_100x100,DFS,2,5.329300,3543,1531
large_100x100,DFS,3,5.223300,3543,1531
large_100x100,DFS,4,5.729900,3543,1531
large_100x100,DFS,5,5.497400,3543,1531
large_100x100,A*,1,2.101500,853,195
large_100x100,A*,2,2.264500,853,195
large_100x100,A*,3,2.064100,853,195
large_100x100,A*,4,2.031700,853,195
large_100x100,A*,5,2.046500,853,195
large_100x100,Dijkstra,1,25.021300,5571,195
large_100x100,Dijkstra,2,13.541100,5571,195
large_100x100,Dijkstra,3,12.884100,5571,195
large_100x100,Dijkstra,4,13.481800,5571,195
large_100x100,Dijkstra,5,12.748000,5571,195
empty_30x30,BFS,1,1.234300,896,55
empty_30x30,BFS,2,1.163400,896,55
empty_30x30,BFS,3,1.145700,896,55
empty_30x30,BFS,4,1.177300,896,55
empty_30x30,BFS,5,1.175100,896,55
empty_30x30,DFS,1,1.338000,842,815
empty_30x30,DFS,2,1.296500,842,815
empty_30x30,DFS,3,1.296700,842,815
empty_30x30,DFS,4,1.280100,842,815
empty_30x30,DFS,5,1.290800,842,815
empty_30x30,A*,1,2.183400,784,55
empty_30x30,A*,2,2.522900,784,55
empty_30x30,A*,3,1.985000,784,55
empty_30x30,A*,4,1.972100,784,55
empty_30x30,A*,5,2.088600,784,55
empty_30x30,Dijkstra,1,2.080400,896,55
empty_30x30,Dijkstra,2,2.100100,896,55
empty_30x30,Dijkstra,3,2.130700,896,55
empty_30x30,Dijkstra,4,2.073600,896,55
empty_30x30,Dijkstra,5,2.095900,896,55
no_path_30x30,BFS,1,0.645900,450,0
no_path_30x30,BFS,2,0.566600,450,0
no_path_30x30,BFS,3,0.566000,450,0
no_path_30x30,BFS,4,0.583500,450,0
no_path_30x30,BFS,5,0.568900,450,0
no_path_30x30,DFS,1,0.692100,450,0
no_path_30x30,DFS,2,0.676900,450,0
no_path_30x30,DFS,3,0.703500,450,0
no_path_30x30,DFS,4,0.722300,450,0
no_path_30x30,DFS,5,0.672000,450,0
no_path_30x30,A*,1,1.112700,450,0
no_path_30x30,A*,2,1.130000,450,0
no_path_30x30,A*,3,1.096100,450,0
no_path_30x30,A*,4,1.111400,450,0
no_path_30x30,A*,5,1.183500,450,0
no_path_30x30,Dijkstra,1,1.023300,450,0
no_path_30x30,Dijkstra,2,1.011700,450,0
no_path_30x30,Dijkstra,3,1.127200,450,0
no_path_30x30,Dijkstra,4,1.110200,450,0
no_path_30x30,Dijkstra,5,1.043900,450,0
weighted_30x30,BFS,1,1.074700,788,55
weighted_30x30,BFS,2,0.997700,788,55
weighted_30x30,BFS,3,0.992700,788,55
weighted_30x30,BFS,4,1.010800,788,55
weighted_30x30,BFS,5,1.035000,788,55
weighted_30x30,DFS,1,1.130200,693,479
weighted_30x30,DFS,2,1.057400,693,479
weighted_30x30,DFS,3,1.049900,693,479
weighted_30x30,DFS,4,1.051600,693,479
weighted_30x30,DFS,5,1.059100,693,479
weighted_30x30,A*,1,0.402200,126,55
weighted_30x30,A*,2,0.384100,126,55
weighted_30x30,A*,3,0.360000,126,55
weighted_30x30,A*,4,0.360700,126,55
weighted_30x30,A*,5,0.353500,126,55
weighted_30x30,Dijkstra,1,1.834900,781,55
weighted_30x30,Dijkstra,2,1.759000,781,55
weighted_30x30,Dijkstra,3,1.786300,781,55
weighted_30x30,Dijkstra,4,1.740500,781,55
weighted_30x30,Dijkstra,5,1.807100,781,55
1 maze strategy run time_ms visited_cells path_length
2 small_10x10 BFS 1 0.044300 15 15
3 small_10x10 BFS 2 0.022800 15 15
4 small_10x10 BFS 3 0.020400 15 15
5 small_10x10 BFS 4 0.020300 15 15
6 small_10x10 BFS 5 0.018700 15 15
7 small_10x10 DFS 1 0.031200 15 15
8 small_10x10 DFS 2 0.022000 15 15
9 small_10x10 DFS 3 0.021200 15 15
10 small_10x10 DFS 4 0.020800 15 15
11 small_10x10 DFS 5 0.020500 15 15
12 small_10x10 A* 1 0.048900 15 15
13 small_10x10 A* 2 0.034700 15 15
14 small_10x10 A* 3 0.029400 15 15
15 small_10x10 A* 4 0.029100 15 15
16 small_10x10 A* 5 0.029300 15 15
17 small_10x10 Dijkstra 1 0.037900 15 15
18 small_10x10 Dijkstra 2 0.028500 15 15
19 small_10x10 Dijkstra 3 0.026800 15 15
20 small_10x10 Dijkstra 4 0.026400 15 15
21 small_10x10 Dijkstra 5 0.026700 15 15
22 medium_50x50 BFS 1 2.105800 1579 95
23 medium_50x50 BFS 2 1.928700 1579 95
24 medium_50x50 BFS 3 1.969500 1579 95
25 medium_50x50 BFS 4 1.938800 1579 95
26 medium_50x50 BFS 5 1.943600 1579 95
27 medium_50x50 DFS 1 1.927300 1277 647
28 medium_50x50 DFS 2 1.856300 1277 647
29 medium_50x50 DFS 3 1.890100 1277 647
30 medium_50x50 DFS 4 1.868000 1277 647
31 medium_50x50 DFS 5 1.865500 1277 647
32 medium_50x50 A* 1 2.359000 927 95
33 medium_50x50 A* 2 2.193700 927 95
34 medium_50x50 A* 3 2.178400 927 95
35 medium_50x50 A* 4 2.181800 927 95
36 medium_50x50 A* 5 2.174500 927 95
37 medium_50x50 Dijkstra 1 3.534700 1579 95
38 medium_50x50 Dijkstra 2 3.435500 1579 95
39 medium_50x50 Dijkstra 3 3.457600 1579 95
40 medium_50x50 Dijkstra 4 3.417300 1579 95
41 medium_50x50 Dijkstra 5 3.538000 1579 95
42 large_100x100 BFS 1 8.624100 5566 195
43 large_100x100 BFS 2 7.706900 5566 195
44 large_100x100 BFS 3 9.723300 5566 195
45 large_100x100 BFS 4 7.585700 5566 195
46 large_100x100 BFS 5 8.031300 5566 195
47 large_100x100 DFS 1 5.512400 3543 1531
48 large_100x100 DFS 2 5.329300 3543 1531
49 large_100x100 DFS 3 5.223300 3543 1531
50 large_100x100 DFS 4 5.729900 3543 1531
51 large_100x100 DFS 5 5.497400 3543 1531
52 large_100x100 A* 1 2.101500 853 195
53 large_100x100 A* 2 2.264500 853 195
54 large_100x100 A* 3 2.064100 853 195
55 large_100x100 A* 4 2.031700 853 195
56 large_100x100 A* 5 2.046500 853 195
57 large_100x100 Dijkstra 1 25.021300 5571 195
58 large_100x100 Dijkstra 2 13.541100 5571 195
59 large_100x100 Dijkstra 3 12.884100 5571 195
60 large_100x100 Dijkstra 4 13.481800 5571 195
61 large_100x100 Dijkstra 5 12.748000 5571 195
62 empty_30x30 BFS 1 1.234300 896 55
63 empty_30x30 BFS 2 1.163400 896 55
64 empty_30x30 BFS 3 1.145700 896 55
65 empty_30x30 BFS 4 1.177300 896 55
66 empty_30x30 BFS 5 1.175100 896 55
67 empty_30x30 DFS 1 1.338000 842 815
68 empty_30x30 DFS 2 1.296500 842 815
69 empty_30x30 DFS 3 1.296700 842 815
70 empty_30x30 DFS 4 1.280100 842 815
71 empty_30x30 DFS 5 1.290800 842 815
72 empty_30x30 A* 1 2.183400 784 55
73 empty_30x30 A* 2 2.522900 784 55
74 empty_30x30 A* 3 1.985000 784 55
75 empty_30x30 A* 4 1.972100 784 55
76 empty_30x30 A* 5 2.088600 784 55
77 empty_30x30 Dijkstra 1 2.080400 896 55
78 empty_30x30 Dijkstra 2 2.100100 896 55
79 empty_30x30 Dijkstra 3 2.130700 896 55
80 empty_30x30 Dijkstra 4 2.073600 896 55
81 empty_30x30 Dijkstra 5 2.095900 896 55
82 no_path_30x30 BFS 1 0.645900 450 0
83 no_path_30x30 BFS 2 0.566600 450 0
84 no_path_30x30 BFS 3 0.566000 450 0
85 no_path_30x30 BFS 4 0.583500 450 0
86 no_path_30x30 BFS 5 0.568900 450 0
87 no_path_30x30 DFS 1 0.692100 450 0
88 no_path_30x30 DFS 2 0.676900 450 0
89 no_path_30x30 DFS 3 0.703500 450 0
90 no_path_30x30 DFS 4 0.722300 450 0
91 no_path_30x30 DFS 5 0.672000 450 0
92 no_path_30x30 A* 1 1.112700 450 0
93 no_path_30x30 A* 2 1.130000 450 0
94 no_path_30x30 A* 3 1.096100 450 0
95 no_path_30x30 A* 4 1.111400 450 0
96 no_path_30x30 A* 5 1.183500 450 0
97 no_path_30x30 Dijkstra 1 1.023300 450 0
98 no_path_30x30 Dijkstra 2 1.011700 450 0
99 no_path_30x30 Dijkstra 3 1.127200 450 0
100 no_path_30x30 Dijkstra 4 1.110200 450 0
101 no_path_30x30 Dijkstra 5 1.043900 450 0
102 weighted_30x30 BFS 1 1.074700 788 55
103 weighted_30x30 BFS 2 0.997700 788 55
104 weighted_30x30 BFS 3 0.992700 788 55
105 weighted_30x30 BFS 4 1.010800 788 55
106 weighted_30x30 BFS 5 1.035000 788 55
107 weighted_30x30 DFS 1 1.130200 693 479
108 weighted_30x30 DFS 2 1.057400 693 479
109 weighted_30x30 DFS 3 1.049900 693 479
110 weighted_30x30 DFS 4 1.051600 693 479
111 weighted_30x30 DFS 5 1.059100 693 479
112 weighted_30x30 A* 1 0.402200 126 55
113 weighted_30x30 A* 2 0.384100 126 55
114 weighted_30x30 A* 3 0.360000 126 55
115 weighted_30x30 A* 4 0.360700 126 55
116 weighted_30x30 A* 5 0.353500 126 55
117 weighted_30x30 Dijkstra 1 1.834900 781 55
118 weighted_30x30 Dijkstra 2 1.759000 781 55
119 weighted_30x30 Dijkstra 3 1.786300 781 55
120 weighted_30x30 Dijkstra 4 1.740500 781 55
121 weighted_30x30 Dijkstra 5 1.807100 781 55

Binary file not shown.

After

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 24 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 18 KiB

View File

@ -0,0 +1,25 @@
maze,strategy,avg_time_ms,avg_visited_cells,avg_path_length,runs
small_10x10,BFS,0.025300,15.00,15.00,5
small_10x10,DFS,0.023140,15.00,15.00,5
small_10x10,A*,0.034280,15.00,15.00,5
small_10x10,Dijkstra,0.029260,15.00,15.00,5
medium_50x50,BFS,1.977280,1579.00,95.00,5
medium_50x50,DFS,1.881440,1277.00,647.00,5
medium_50x50,A*,2.217480,927.00,95.00,5
medium_50x50,Dijkstra,3.476620,1579.00,95.00,5
large_100x100,BFS,8.334260,5566.00,195.00,5
large_100x100,DFS,5.458460,3543.00,1531.00,5
large_100x100,A*,2.101660,853.00,195.00,5
large_100x100,Dijkstra,15.535260,5571.00,195.00,5
empty_30x30,BFS,1.179160,896.00,55.00,5
empty_30x30,DFS,1.300420,842.00,815.00,5
empty_30x30,A*,2.150400,784.00,55.00,5
empty_30x30,Dijkstra,2.096140,896.00,55.00,5
no_path_30x30,BFS,0.586180,450.00,0.00,5
no_path_30x30,DFS,0.693360,450.00,0.00,5
no_path_30x30,A*,1.126740,450.00,0.00,5
no_path_30x30,Dijkstra,1.063260,450.00,0.00,5
weighted_30x30,BFS,1.022180,788.00,55.00,5
weighted_30x30,DFS,1.069640,693.00,479.00,5
weighted_30x30,A*,0.372100,126.00,55.00,5
weighted_30x30,Dijkstra,1.785560,781.00,55.00,5
1 maze strategy avg_time_ms avg_visited_cells avg_path_length runs
2 small_10x10 BFS 0.025300 15.00 15.00 5
3 small_10x10 DFS 0.023140 15.00 15.00 5
4 small_10x10 A* 0.034280 15.00 15.00 5
5 small_10x10 Dijkstra 0.029260 15.00 15.00 5
6 medium_50x50 BFS 1.977280 1579.00 95.00 5
7 medium_50x50 DFS 1.881440 1277.00 647.00 5
8 medium_50x50 A* 2.217480 927.00 95.00 5
9 medium_50x50 Dijkstra 3.476620 1579.00 95.00 5
10 large_100x100 BFS 8.334260 5566.00 195.00 5
11 large_100x100 DFS 5.458460 3543.00 1531.00 5
12 large_100x100 A* 2.101660 853.00 195.00 5
13 large_100x100 Dijkstra 15.535260 5571.00 195.00 5
14 empty_30x30 BFS 1.179160 896.00 55.00 5
15 empty_30x30 DFS 1.300420 842.00 815.00 5
16 empty_30x30 A* 2.150400 784.00 55.00 5
17 empty_30x30 Dijkstra 2.096140 896.00 55.00 5
18 no_path_30x30 BFS 0.586180 450.00 0.00 5
19 no_path_30x30 DFS 0.693360 450.00 0.00 5
20 no_path_30x30 A* 1.126740 450.00 0.00 5
21 no_path_30x30 Dijkstra 1.063260 450.00 0.00 5
22 weighted_30x30 BFS 1.022180 788.00 55.00 5
23 weighted_30x30 DFS 1.069640 693.00 479.00 5
24 weighted_30x30 A* 0.372100 126.00 55.00 5
25 weighted_30x30 Dijkstra 1.785560 781.00 55.00 5

Binary file not shown.

After

Width:  |  Height:  |  Size: 21 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 22 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 25 KiB

59
BolonkinNM/main.py Normal file
View File

@ -0,0 +1,59 @@
from builders.text_file_maze_builder import TextFileMazeBuilder
from core.player import Player
from observer.console_view import ConsoleView
from solver.maze_solver import MazeSolver
from strategies.astar_strategy import AStarStrategy
from strategies.bfs_strategy import BFSStrategy
from strategies.dfs_strategy import DFSStrategy
from controller.game_controller import GameController
from pathlib import Path
BASE_DIR = Path(__file__).resolve().parent
def run_demo():
builder = TextFileMazeBuilder()
maze = builder.buildFromFile(str(BASE_DIR / "mazes" / "maze_small.txt"))
view = ConsoleView()
view.update({"type": "maze_loaded", "message": "Maze loaded"})
view.render(maze)
solver = MazeSolver(maze)
solver.addObserver(view)
for strategy in (BFSStrategy(), DFSStrategy(), AStarStrategy()):
solver.setStrategy(strategy)
stats = solver.solve()
print()
print(f"=== {strategy.name} ===")
print(f"Time: {stats.timeMs:.3f} ms")
print(f"Visited cells: {stats.visitedCells}")
print(f"Path length: {stats.pathLength}")
print(f"Path found: {'yes' if stats.found else 'no'}")
view.render(maze, path=stats.path)
player = Player(maze.startCell)
controller = GameController(maze, player, view)
print("Manual mode: W/A/S/D move, Z undo, Q quit")
view.render(maze, player_position=player.currentCell)
while True:
cmd = input("Command: ").strip().upper()
if cmd == "Q":
break
if cmd == "Z":
controller.undo()
elif cmd in {"W", "A", "S", "D"}:
controller.move(cmd)
else:
print("Unknown command")
if __name__ == "__main__":
run_demo()

View File

@ -0,0 +1,9 @@
S
E

View File

@ -0,0 +1,11 @@
####################################################################################################
#S # # # # # # # # # # # # # # # E#
# # ### ### # ###### # ### # ## # #### # ####### # #### # # ### ## # ## # # ## # ## # ##### ### ##
# # # # # # # # # # # # # # # # # # # # # # # # # # #
# ##### # ######## # ### # ## # #### # ####### ## ### # # #### ####### ## ####### ####### # ### ##
# # # # # # # # # # # # # # # # # # # # #
### # # ###### # ########### ########### ### ####### # ####### ### # # ###### # ### ### # ### ####
# # # # # # # # # # # # # # # # # # # # # #
# ### ###### # ##### # ### # ####### # ### ### ## # ###### # ### # ### ###### # ### # ### ### ## #
# # # # # # # # #
####################################################################################################

View File

@ -0,0 +1,11 @@
##################################################
#S # # # # # # E#
# # ### ### # ###### # ### # ## # #### # ####### ##
# # # # # # # # # # # # # #
# ##### # ######## # ### # ## # #### # ####### ## #
# # # # # # # # # #
### # # ###### # ########### ########### ### ######
# # # # # # # # # # #
# ### ###### # ##### # ### # ####### # ### ### ## #
# # # # #
##################################################

View File

@ -0,0 +1,9 @@
##########
#S #
# ###### #
# # #
##########
# #E#
# ###### #
# #
##########

View File

@ -0,0 +1,7 @@
##########
#S #E#
# ## # # ##
# # #
# #### # #
# # #
##########

View File

@ -0,0 +1,10 @@
1111111111111111111111111111
1S11111111111111111111111111
1111111111111111111111111111
1111111111111111111111111111
1111111111111222222222222111
1111111111111222222222222111
1111111111111333333333333111
1111111111111333333333333111
111111111111111111111111111E
1111111111111111111111111111

View File

View File

@ -0,0 +1,26 @@
import os
from observer.observer import Observer
class ConsoleView(Observer):
def update(self, event):
if isinstance(event, str):
print(f"[EVENT] {event}")
elif isinstance(event, dict):
event_type = event.get("type", "unknown")
if event_type == "search_finished":
stats = event.get("stats")
print(f"[EVENT] search finished: {stats}")
else:
print(f"[EVENT] {event_type}: {event}")
else:
print("[EVENT] unknown")
def clear(self):
os.system("cls" if os.name == "nt" else "clear")
def render(self, maze, player_position=None, path=None, clear_screen=False):
if clear_screen:
self.clear()
print(maze.render(player_position=player_position, path=path))
print()

View File

@ -0,0 +1,7 @@
from abc import ABC, abstractmethod
class Observer(ABC):
@abstractmethod
def update(self, event):
raise NotImplementedError

View File

@ -0,0 +1 @@
matplotlib

View File

View File

@ -0,0 +1,50 @@
import time
from core.search_stats import SearchStats
class MazeSolver:
def __init__(self, maze, strategy=None):
self.maze = maze
self.strategy = strategy
self.observers = []
def setStrategy(self, strategy):
self.strategy = strategy
def addObserver(self, observer):
if observer not in self.observers:
self.observers.append(observer)
def removeObserver(self, observer):
if observer in self.observers:
self.observers.remove(observer)
def notify(self, event):
for observer in self.observers:
observer.update(event)
def solve(self):
if self.strategy is None:
raise ValueError("Strategy is not set")
self.notify({"type": "search_started", "strategy": self.strategy.name})
start_time = time.perf_counter()
path = self.strategy.findPath(self.maze, self.maze.startCell, self.maze.exitCell)
end_time = time.perf_counter()
stats = SearchStats(
timeMs=(end_time - start_time) * 1000.0,
visitedCells=getattr(self.strategy, "visitedCount", 0),
pathLength=len(path),
path=path,
found=bool(path),
algorithm=getattr(self.strategy, "name", "")
)
if stats.found:
self.notify({"type": "path_found", "strategy": stats.algorithm, "length": stats.pathLength})
else:
self.notify({"type": "path_not_found", "strategy": stats.algorithm})
self.notify({"type": "search_finished", "stats": stats})
return stats

View File

View File

@ -0,0 +1,45 @@
import heapq
from strategies.pathfinding_strategy import PathFindingStrategy
class AStarStrategy(PathFindingStrategy):
name = "A*"
def heuristic(self, cell, exitCell):
return abs(cell.x - exitCell.x) + abs(cell.y - exitCell.y)
def findPath(self, maze, start, exitCell):
self.visitedCount = 0
if start is None or exitCell is None:
return []
open_set = []
heapq.heappush(open_set, (0, 0, start.x, start.y, start))
parent = {}
g_score = {(start.x, start.y): 0}
closed = set()
while open_set:
f_score, current_g, _, _, current = heapq.heappop(open_set)
pos = (current.x, current.y)
if pos in closed:
continue
closed.add(pos)
self.visitedCount += 1
if current.x == exitCell.x and current.y == exitCell.y:
return self._restore_path(parent, start, exitCell)
for neighbor in maze.getNeighbors(current):
npos = (neighbor.x, neighbor.y)
tentative_g = current_g + getattr(neighbor, "weight", 1)
if tentative_g < g_score.get(npos, float("inf")):
g_score[npos] = tentative_g
parent[npos] = current
new_f = tentative_g + self.heuristic(neighbor, exitCell)
heapq.heappush(open_set, (new_f, tentative_g, neighbor.x, neighbor.y, neighbor))
return []

View File

@ -0,0 +1,31 @@
from collections import deque
from strategies.pathfinding_strategy import PathFindingStrategy
class BFSStrategy(PathFindingStrategy):
name = "BFS"
def findPath(self, maze, start, exitCell):
self.visitedCount = 0
if start is None or exitCell is None:
return []
queue = deque([start])
visited = {(start.x, start.y)}
parent = {}
while queue:
current = queue.popleft()
self.visitedCount += 1
if current.x == exitCell.x and current.y == exitCell.y:
return self._restore_path(parent, start, exitCell)
for neighbor in maze.getNeighbors(current):
pos = (neighbor.x, neighbor.y)
if pos not in visited:
visited.add(pos)
parent[pos] = current
queue.append(neighbor)
return []

View File

@ -0,0 +1,35 @@
from strategies.pathfinding_strategy import PathFindingStrategy
class DFSStrategy(PathFindingStrategy):
name = "DFS"
def findPath(self, maze, start, exitCell):
self.visitedCount = 0
if start is None or exitCell is None:
return []
stack = [start]
visited = set()
parent = {}
while stack:
current = stack.pop()
pos = (current.x, current.y)
if pos in visited:
continue
visited.add(pos)
self.visitedCount += 1
if current.x == exitCell.x and current.y == exitCell.y:
return self._restore_path(parent, start, exitCell)
neighbors = maze.getNeighbors(current)
for neighbor in reversed(neighbors):
npos = (neighbor.x, neighbor.y)
if npos not in visited:
parent[npos] = current
stack.append(neighbor)
return []

View File

@ -0,0 +1,41 @@
import heapq
from strategies.pathfinding_strategy import PathFindingStrategy
class DijkstraStrategy(PathFindingStrategy):
name = "Dijkstra"
def findPath(self, maze, start, exitCell):
self.visitedCount = 0
if start is None or exitCell is None:
return []
pq = [(0, start.x, start.y, start)]
dist = {(start.x, start.y): 0}
parent = {}
closed = set()
while pq:
current_cost, _, _, current = heapq.heappop(pq)
pos = (current.x, current.y)
if pos in closed:
continue
closed.add(pos)
self.visitedCount += 1
if current.x == exitCell.x and current.y == exitCell.y:
return self._restore_path(parent, start, exitCell)
for neighbor in maze.getNeighbors(current):
npos = (neighbor.x, neighbor.y)
step_cost = getattr(neighbor, "weight", 1)
new_cost = current_cost + step_cost
if new_cost < dist.get(npos, float("inf")):
dist[npos] = new_cost
parent[npos] = current
heapq.heappush(pq, (new_cost, neighbor.x, neighbor.y, neighbor))
return []

View File

@ -0,0 +1,30 @@
from abc import ABC, abstractmethod
class PathFindingStrategy(ABC):
name = "Base"
def __init__(self):
self.visitedCount = 0
@abstractmethod
def findPath(self, maze, start, exitCell):
raise NotImplementedError
def _restore_path(self, parent, start, exitCell):
if exitCell is None or start is None:
return []
path = []
current = exitCell
while True:
path.append(current)
if current.x == start.x and current.y == start.y:
break
current = parent.get((current.x, current.y))
if current is None:
return []
path.reverse()
return path

1
BoriskovaDV/428.md Normal file
View File

@ -0,0 +1 @@

View File

@ -0,0 +1,71 @@
def create_node(name, phone):
return {'name': name, 'phone': phone, 'left': None, 'right': None}
def bst_insert(root, name, phone):
if root is None:
return create_node(name, phone)
if name == root['name']:
root['phone'] = phone
elif name < root['name']:
root['left'] = bst_insert(root['left'], name, phone)
else:
root['right'] = bst_insert(root['right'], name, phone)
return root
def bst_find(root, name):
if root is None:
return None
if name == root['name']:
return root['phone']
elif name < root['name']:
return bst_find(root['left'], name)
else:
return bst_find(root['right'], name)
def _find_min(node):
while node['left'] is not None:
node = node['left']
return node
def bst_delete(root, name):
if root is None:
return None
if name < root['name']:
root['left'] = bst_delete(root['left'], name)
elif name > root['name']:
root['right'] = bst_delete(root['right'], name)
else:
if root['left'] is None:
return root['right']
if root['right'] is None:
return root['left']
min_node = _find_min(root['right'])
root['name'] = min_node['name']
root['phone'] = min_node['phone']
root['right'] = bst_delete(root['right'], min_node['name'])
return root
def bst_list_all(root):
result = []
def inorder(node):
if node is None:
return
inorder(node['left'])
result.append((node['name'], node['phone']))
inorder(node['right'])
inorder(root)
return result
if __name__ == '__main__':
root = None
root = bst_insert(root, 'Иван', '123-456')
root = bst_insert(root, 'Борис', '789-012')
root = bst_insert(root, 'Анна', '345-678')
root = bst_insert(root, 'Иван', '111-222')
print(bst_list_all(root))
print(bst_find(root, 'Иван'))
print(bst_find(root, 'Петр'))
root = bst_delete(root, 'Борис')
print(bst_list_all(root))

View File

@ -0,0 +1,126 @@
import random
import time
import csv
import sys
sys.setrecursionlimit(20000)
from linked_list_phonebook import ll_insert, ll_find, ll_delete, ll_list_all
from hash_table_phonebook import ht_insert, ht_find, ht_delete, ht_list_all
from bst_phonebook import bst_insert, bst_find, bst_delete, bst_list_all
def generate_records(n, seed=42):
random.seed(seed)
records = []
for i in range(1, n+1):
name = f"User_{i:05d}"
phone = f"{random.randint(100,999)}-{random.randint(1000,9999)}"
records.append((name, phone))
return records
def prepare_datasets(base_records):
shuffled = base_records.copy()
random.shuffle(shuffled)
sorted_records = sorted(base_records, key=lambda x: x[0])
return shuffled, sorted_records
def run_experiment(struct_funcs, records, mode_name, repeats=5):
results = []
for rep in range(repeats):
struct = struct_funcs['create']()
start = time.perf_counter()
for name, phone in records:
struct = struct_funcs['insert'](struct, name, phone)
end = time.perf_counter()
insert_time = end - start
existing_names = [name for name, _ in records]
sample_existing = random.sample(existing_names, 100)
nonexistent = [f"NotExist_{i}" for i in range(10)]
search_names = sample_existing + nonexistent
random.shuffle(search_names)
start = time.perf_counter()
for name in search_names:
_ = struct_funcs['find'](struct, name)
end = time.perf_counter()
find_time = end - start
to_delete = random.sample(existing_names, 50)
start = time.perf_counter()
for name in to_delete:
struct = struct_funcs['delete'](struct, name)
end = time.perf_counter()
delete_time = end - start
results.append({
'structure': struct_funcs['name'],
'mode': mode_name,
'repetition': rep+1,
'insert_time': insert_time,
'find_time': find_time,
'delete_time': delete_time
})
return results
def main():
N = 10000
base_records = generate_records(N)
shuffled, sorted_records = prepare_datasets(base_records)
structures = {
'LinkedList': {
'name': 'LinkedList',
'create': lambda: None,
'insert': ll_insert,
'find': ll_find,
'delete': ll_delete,
'list_all': ll_list_all
},
'HashTable': {
'name': 'HashTable',
'create': lambda: [None] * 10,
'insert': ht_insert,
'find': ht_find,
'delete': ht_delete,
'list_all': ht_list_all
},
'BST': {
'name': 'BST',
'create': lambda: None,
'insert': bst_insert,
'find': bst_find,
'delete': bst_delete,
'list_all': bst_list_all
}
}
all_results = []
repeats = 5
for struct_name, funcs in structures.items():
print(f"Testing {struct_name} on random order...")
res_random = run_experiment(funcs, shuffled, 'random', repeats)
all_results.extend(res_random)
print(f"Testing {struct_name} on sorted order...")
res_sorted = run_experiment(funcs, sorted_records, 'sorted', repeats)
all_results.extend(res_sorted)
with open('experiment_results.csv', 'w', newline='', encoding='utf-8') as f:
writer = csv.writer(f)
writer.writerow(['Structure', 'Mode', 'Repeat', 'Insert (sec)', 'Search (sec)', 'Delete (sec)'])
for r in all_results:
writer.writerow([
r['structure'],
r['mode'],
r['repetition'],
f"{r['insert_time']:.6f}",
f"{r['find_time']:.6f}",
f"{r['delete_time']:.6f}"
])
print("Experiment finished. Results saved to experiment_results.csv")
if __name__ == '__main__':
main()

View File

@ -0,0 +1,31 @@
Structure,Mode,Repeat,Insert (sec),Search (sec),Delete (sec)
LinkedList,random,1,4.432559,0.034196,0.014270
LinkedList,random,2,4.999931,0.038043,0.020281
LinkedList,random,3,4.771456,0.030191,0.014131
LinkedList,random,4,4.707315,0.033500,0.016198
LinkedList,random,5,4.721361,0.036586,0.011988
LinkedList,sorted,1,4.139028,0.024011,0.010482
LinkedList,sorted,2,4.212383,0.024592,0.011765
LinkedList,sorted,3,4.674211,0.027756,0.012189
LinkedList,sorted,4,4.610210,0.031519,0.012244
LinkedList,sorted,5,4.565687,0.029739,0.012747
HashTable,random,1,0.659990,0.003889,0.001728
HashTable,random,2,0.666055,0.005980,0.002002
HashTable,random,3,0.669948,0.004087,0.002176
HashTable,random,4,0.661882,0.007439,0.001897
HashTable,random,5,0.680420,0.004016,0.001649
HashTable,sorted,1,0.648261,0.004277,0.002922
HashTable,sorted,2,0.654924,0.004136,0.001793
HashTable,sorted,3,0.645509,0.003900,0.002249
HashTable,sorted,4,0.637906,0.004056,0.001657
HashTable,sorted,5,0.643536,0.003846,0.001741
BST,random,1,0.029415,0.000515,0.000183
BST,random,2,0.027684,0.000216,0.000142
BST,random,3,0.026213,0.000252,0.000159
BST,random,4,0.026987,0.000207,0.000135
BST,random,5,0.028321,0.000271,0.000183
BST,sorted,1,10.293772,0.093178,0.053520
BST,sorted,2,10.142204,0.088924,0.049079
BST,sorted,3,10.142037,0.078281,0.059416
BST,sorted,4,10.139818,0.100162,0.056881
BST,sorted,5,10.102982,0.082247,0.051973
1 Structure Mode Repeat Insert (sec) Search (sec) Delete (sec)
2 LinkedList random 1 4.432559 0.034196 0.014270
3 LinkedList random 2 4.999931 0.038043 0.020281
4 LinkedList random 3 4.771456 0.030191 0.014131
5 LinkedList random 4 4.707315 0.033500 0.016198
6 LinkedList random 5 4.721361 0.036586 0.011988
7 LinkedList sorted 1 4.139028 0.024011 0.010482
8 LinkedList sorted 2 4.212383 0.024592 0.011765
9 LinkedList sorted 3 4.674211 0.027756 0.012189
10 LinkedList sorted 4 4.610210 0.031519 0.012244
11 LinkedList sorted 5 4.565687 0.029739 0.012747
12 HashTable random 1 0.659990 0.003889 0.001728
13 HashTable random 2 0.666055 0.005980 0.002002
14 HashTable random 3 0.669948 0.004087 0.002176
15 HashTable random 4 0.661882 0.007439 0.001897
16 HashTable random 5 0.680420 0.004016 0.001649
17 HashTable sorted 1 0.648261 0.004277 0.002922
18 HashTable sorted 2 0.654924 0.004136 0.001793
19 HashTable sorted 3 0.645509 0.003900 0.002249
20 HashTable sorted 4 0.637906 0.004056 0.001657
21 HashTable sorted 5 0.643536 0.003846 0.001741
22 BST random 1 0.029415 0.000515 0.000183
23 BST random 2 0.027684 0.000216 0.000142
24 BST random 3 0.026213 0.000252 0.000159
25 BST random 4 0.026987 0.000207 0.000135
26 BST random 5 0.028321 0.000271 0.000183
27 BST sorted 1 10.293772 0.093178 0.053520
28 BST sorted 2 10.142204 0.088924 0.049079
29 BST sorted 3 10.142037 0.078281 0.059416
30 BST sorted 4 10.139818 0.100162 0.056881
31 BST sorted 5 10.102982 0.082247 0.051973

View File

@ -0,0 +1,47 @@
from linked_list_phonebook import ll_insert, ll_find, ll_delete, ll_list_all
def hash_function(name, table_size):
return hash(name) % table_size
def ht_insert(buckets, name, phone):
idx = hash_function(name, len(buckets))
head = buckets[idx]
new_head = ll_insert(head, name, phone)
buckets[idx] = new_head
return buckets
def ht_find(buckets, name):
idx = hash_function(name, len(buckets))
head = buckets[idx]
return ll_find(head, name)
def ht_delete(buckets, name):
idx = hash_function(name, len(buckets))
head = buckets[idx]
new_head = ll_delete(head, name)
buckets[idx] = new_head
return buckets
def ht_list_all(buckets):
all_records = []
for head in buckets:
current = head
while current is not None:
all_records.append((current['name'], current['phone']))
current = current['next']
all_records.sort(key=lambda x: x[0])
return all_records
if __name__ == '__main__':
SIZE = 5
buckets = [None] * SIZE
ht_insert(buckets, 'Иван', '123-456')
ht_insert(buckets, 'Борис', '789-012')
ht_insert(buckets, 'Анна', '345-678')
ht_insert(buckets, 'Иван', '111-222')
print(ht_list_all(buckets))
print(ht_find(buckets, 'Анна'))
print(ht_find(buckets, 'Петр'))
ht_delete(buckets, 'Борис')
print(ht_list_all(buckets))

View File

@ -0,0 +1,67 @@
def create_node(name, phone):
return {'name': name, 'phone': phone, 'next': None}
def ll_insert(head, name, phone):
current = head
while current is not None:
if current['name'] == name:
current['phone'] = phone
return head
current = current['next']
new_node = create_node(name, phone)
if head is None:
return new_node
current = head
while current['next'] is not None:
current = current['next']
current['next'] = new_node
return head
def ll_find(head, name):
current = head
while current is not None:
if current['name'] == name:
return current['phone']
current = current['next']
return None
def ll_delete(head, name):
if head is None:
return None
if head['name'] == name:
return head['next']
prev = head
current = head['next']
while current is not None:
if current['name'] == name:
prev['next'] = current['next']
return head
prev = current
current = current['next']
return head
def ll_list_all(head):
records = []
current = head
while current is not None:
records.append((current['name'], current['phone']))
current = current['next']
records.sort(key=lambda pair: pair[0])
return records
if __name__ == '__main__':
head = None
head = ll_insert(head, 'Иван', '123-456')
head = ll_insert(head, 'Борис', '789-012')
head = ll_insert(head, 'Анна', '345-678')
head = ll_insert(head, 'Иван', '111-222')
print(ll_list_all(head))
print(ll_find(head, 'Иван'))
print(ll_find(head, 'Петр'))
head = ll_delete(head, 'Борис')
print(ll_list_all(head))

Binary file not shown.

After

Width:  |  Height:  |  Size: 46 KiB

View File

@ -0,0 +1,39 @@
import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
df = pd.read_csv('experiment_results.csv')
mean_times = df.groupby(['Structure', 'Mode'])[['Insert (sec)', 'Search (sec)', 'Delete (sec)']].mean().reset_index()
structures = mean_times['Structure'].unique()
modes = mean_times['Mode'].unique()
fig, axes = plt.subplots(1, 3, figsize=(15, 5))
operations = ['Insert (sec)', 'Search (sec)', 'Delete (sec)']
titles = ['Insertion', 'Search', 'Deletion']
for ax, op, title in zip(axes, operations, titles):
x = np.arange(len(structures))
width = 0.35
random_vals = []
sorted_vals = []
for s in structures:
random_row = mean_times[(mean_times['Structure'] == s) & (mean_times['Mode'] == 'random')]
sorted_row = mean_times[(mean_times['Structure'] == s) & (mean_times['Mode'] == 'sorted')]
random_vals.append(random_row[op].values[0] if not random_row.empty else 0)
sorted_vals.append(sorted_row[op].values[0] if not sorted_row.empty else 0)
ax.bar(x - width/2, random_vals, width, label='Random')
ax.bar(x + width/2, sorted_vals, width, label='Sorted')
ax.set_xticks(x)
ax.set_xticklabels(structures)
ax.set_ylabel('Time (seconds)')
ax.set_title(title)
ax.legend()
plt.tight_layout()
plt.savefig('performance_comparison.png', dpi=150)
plt.show()

View File

@ -0,0 +1,16 @@
maze,strategy,time_ms,visited_cells,path_length
Small 10x6,BFS,0.05722500009142095,25.0,16.0
Small 10x6,DFS,0.05680966667872175,24.0,16.0
Small 10x6,AStar,0.04801966664066034,23.0,16.0
Medium 10x10,BFS,0.04772166676048073,47.0,16.0
Medium 10x10,DFS,0.034641333362136116,44.0,30.0
Medium 10x10,AStar,0.0983669999641279,47.0,16.0
Large 20x20,BFS,0.09949400002066493,100.0,36.0
Large 20x20,DFS,0.07004933331700158,75.0,68.0
Large 20x20,AStar,0.16450733316257052,85.0,36.0
Empty 15x15,BFS,0.13264433331035738,133.0,17.0
Empty 15x15,DFS,0.11371733338213137,161.0,89.0
Empty 15x15,AStar,0.1543506666621397,65.0,17.0
No exit 10x10,BFS,0.04392100011803753,25.0,0.0
No exit 10x10,DFS,0.05871466661725814,25.0,0.0
No exit 10x10,AStar,0.046440666665148456,25.0,0.0
1 maze strategy time_ms visited_cells path_length
2 Small 10x6 BFS 0.05722500009142095 25.0 16.0
3 Small 10x6 DFS 0.05680966667872175 24.0 16.0
4 Small 10x6 AStar 0.04801966664066034 23.0 16.0
5 Medium 10x10 BFS 0.04772166676048073 47.0 16.0
6 Medium 10x10 DFS 0.034641333362136116 44.0 30.0
7 Medium 10x10 AStar 0.0983669999641279 47.0 16.0
8 Large 20x20 BFS 0.09949400002066493 100.0 36.0
9 Large 20x20 DFS 0.07004933331700158 75.0 68.0
10 Large 20x20 AStar 0.16450733316257052 85.0 36.0
11 Empty 15x15 BFS 0.13264433331035738 133.0 17.0
12 Empty 15x15 DFS 0.11371733338213137 161.0 89.0
13 Empty 15x15 AStar 0.1543506666621397 65.0 17.0
14 No exit 10x10 BFS 0.04392100011803753 25.0 0.0
15 No exit 10x10 DFS 0.05871466661725814 25.0 0.0
16 No exit 10x10 AStar 0.046440666665148456 25.0 0.0

View File

@ -0,0 +1,438 @@
import sys
import os
from collections import deque
import heapq
import time
import csv
import matplotlib.pyplot as plt
import numpy as np
class GridPoint:
def __init__(self, x, y):
self.x = x
self.y = y
self.blocked = False
self.is_start = False
self.is_exit = False
def can_step(self):
return not self.blocked
class Labyrinth:
def __init__(self, w, h):
self.w = w
self.h = h
self.grid = [[GridPoint(x, y) for x in range(w)] for y in range(h)]
self.start_point = None
self.exit_point = None
def get_point(self, x, y):
if 0 <= x < self.w and 0 <= y < self.h:
return self.grid[y][x]
return None
def set_point(self, x, y, typ):
p = self.get_point(x, y)
if not p:
return
if typ == 'wall':
p.blocked = True
elif typ == 'start':
if self.start_point:
self.start_point.is_start = False
p.is_start = True
p.blocked = False
self.start_point = p
elif typ == 'exit':
if self.exit_point:
self.exit_point.is_exit = False
p.is_exit = True
p.blocked = False
self.exit_point = p
elif typ == 'path':
p.blocked = False
def neighbors(self, p):
dirs = [(0, -1), (0, 1), (-1, 0), (1, 0)]
res = []
for dx, dy in dirs:
nx, ny = p.x + dx, p.y + dy
nb = self.get_point(nx, ny)
if nb and nb.can_step():
res.append(nb)
return res
class MazeLoader:
def load(self, filename):
raise NotImplementedError
class TextMazeLoader(MazeLoader):
def load(self, filename):
with open(filename, 'r') as f:
lines = [line.rstrip('\n') for line in f]
h = len(lines)
w = max(len(line) for line in lines) if h > 0 else 0
start_cnt = 0
exit_cnt = 0
lab = Labyrinth(w, h)
for y, line in enumerate(lines):
for x, ch in enumerate(line):
if ch == '#':
lab.set_point(x, y, 'wall')
elif ch == 'S':
lab.set_point(x, y, 'start')
start_cnt += 1
elif ch == 'E':
lab.set_point(x, y, 'exit')
exit_cnt += 1
else:
lab.set_point(x, y, 'path')
if start_cnt != 1 or exit_cnt != 1:
raise ValueError(f"Need exactly one S and one E. Found S={start_cnt}, E={exit_cnt}")
return lab
class SearchAlgorithm:
def find_way(self, lab, start, goal):
raise NotImplementedError
def _build_path(self, prev, start, goal):
path = []
cur = goal
while cur:
path.append(cur)
cur = prev.get(cur)
path.reverse()
return path
def get_visited(self):
return getattr(self, '_visited', 0)
class BreadthFirst(SearchAlgorithm):
def find_way(self, lab, start, goal):
q = deque([start])
prev = {start: None}
seen = {start}
while q:
cur = q.popleft()
if cur == goal:
self._visited = len(seen)
return self._build_path(prev, start, goal)
for nb in lab.neighbors(cur):
if nb not in seen:
seen.add(nb)
prev[nb] = cur
q.append(nb)
self._visited = len(seen)
return []
class DepthFirst(SearchAlgorithm):
def find_way(self, lab, start, goal):
stack = [start]
prev = {start: None}
seen = {start}
while stack:
cur = stack.pop()
if cur == goal:
self._visited = len(seen)
return self._build_path(prev, start, goal)
for nb in lab.neighbors(cur):
if nb not in seen:
seen.add(nb)
prev[nb] = cur
stack.append(nb)
self._visited = len(seen)
return []
class AStar(SearchAlgorithm):
def _dist(self, a, b):
return abs(a.x - b.x) + abs(a.y - b.y)
def find_way(self, lab, start, goal):
heap = []
cnt = 0
start_f = self._dist(start, goal)
heapq.heappush(heap, (start_f, cnt, start))
cnt += 1
prev = {}
g = {start: 0}
f = {start: start_f}
seen = set()
while heap:
cur_f, _, cur = heapq.heappop(heap)
seen.add(cur)
if cur == goal:
self._visited = len(seen)
return self._build_path(prev, start, goal)
if cur_f > f.get(cur, float('inf')):
continue
for nb in lab.neighbors(cur):
new_g = g[cur] + 1
if new_g < g.get(nb, float('inf')):
prev[nb] = cur
g[nb] = new_g
new_f = new_g + self._dist(nb, goal)
f[nb] = new_f
heapq.heappush(heap, (new_f, cnt, nb))
cnt += 1
self._visited = len(seen)
return []
class LabyrinthSolver:
def __init__(self, lab):
self.lab = lab
self.algorithm = None
def set_algorithm(self, algo):
self.algorithm = algo
def solve(self):
if not self.algorithm:
return None
t0 = time.perf_counter()
path = self.algorithm.find_way(self.lab, self.lab.start_point, self.lab.exit_point)
t1 = time.perf_counter()
ms = (t1 - t0) * 1000
return ms, self.algorithm.get_visited(), len(path)
class Player:
def __init__(self, start, lab):
self.current = start
self.last = None
self.lab = lab
def move(self, cell):
if cell and cell.can_step():
self.last = self.current
self.current = cell
return True
return False
def undo(self):
if self.last:
self.current, self.last = self.last, None
return True
return False
class Command:
def do(self):
raise NotImplementedError
def revert(self):
raise NotImplementedError
class MoveCommand(Command):
def __init__(self, player, dx, dy, lab):
self.player = player
self.dx = dx
self.dy = dy
self.lab = lab
self.done = False
def do(self):
nx = self.player.current.x + self.dx
ny = self.player.current.y + self.dy
target = self.lab.get_point(nx, ny)
if target and target.can_step():
self.player.move(target)
self.done = True
return True
return False
def revert(self):
if self.done:
self.player.undo()
self.done = False
return True
return False
class InteractiveView:
def __init__(self, lab, player):
self.lab = lab
self.player = player
def render(self):
os.system('cls' if os.name == 'nt' else 'clear')
print("=" * (self.lab.w * 2 + 4))
print(" LABYRINTH (P = player)")
print("=" * (self.lab.w * 2 + 4))
for y in range(self.lab.h):
print(" ", end='')
for x in range(self.lab.w):
p = self.lab.get_point(x, y)
if self.player.current == p:
print('P', end=' ')
elif p == self.lab.start_point:
print('S', end=' ')
elif p == self.lab.exit_point:
print('E', end=' ')
elif p.blocked:
print('#', end=' ')
else:
print('.', end=' ')
print()
print("=" * (self.lab.w * 2 + 4))
print(f" Position: ({self.player.current.x},{self.player.current.y})")
print(" Controls: h(left) j(down) k(up) l(right) u=undo q=quit")
print(" Auto-search: b=BFS d=DFS a=A*")
def run_experiment(maze_file, algo, runs=5):
loader = TextMazeLoader()
lab = loader.load(maze_file)
total_ms = 0
total_visited = 0
total_len = 0
for _ in range(runs):
solver = LabyrinthSolver(lab)
solver.set_algorithm(algo)
stats = solver.solve()
if stats:
ms, vis, plen = stats
total_ms += ms
total_visited += vis
total_len += plen
return total_ms / runs, total_visited / runs, total_len / runs
def generate_plots(results):
mazes = list(set([r['maze'] for r in results]))
strategies = ['BFS', 'DFS', 'AStar']
fig, axes = plt.subplots(1, 3, figsize=(15, 5))
x = np.arange(len(mazes))
width = 0.25
for i, strat in enumerate(strategies):
times = []
for maze in mazes:
val = next((r['time_ms'] for r in results if r['maze'] == maze and r['strategy'] == strat), 0)
times.append(val)
axes[0].bar(x + i*width, times, width, label=strat)
axes[0].set_xlabel('Maze')
axes[0].set_ylabel('Time (ms)')
axes[0].set_title('Execution Time')
axes[0].set_xticks(x + width)
axes[0].set_xticklabels(mazes, rotation=45, ha='right')
axes[0].legend()
axes[0].grid(True, alpha=0.3)
for i, strat in enumerate(strategies):
visited = []
for maze in mazes:
val = next((r['visited_cells'] for r in results if r['maze'] == maze and r['strategy'] == strat), 0)
visited.append(val)
axes[1].bar(x + i*width, visited, width, label=strat)
axes[1].set_xlabel('Maze')
axes[1].set_ylabel('Visited Cells')
axes[1].set_title('Visited Cells')
axes[1].set_xticks(x + width)
axes[1].set_xticklabels(mazes, rotation=45, ha='right')
axes[1].legend()
axes[1].grid(True, alpha=0.3)
for i, strat in enumerate(strategies):
lengths = []
for maze in mazes:
val = next((r['path_length'] for r in results if r['maze'] == maze and r['strategy'] == strat), 0)
lengths.append(val)
axes[2].bar(x + i*width, lengths, width, label=strat)
axes[2].set_xlabel('Maze')
axes[2].set_ylabel('Path Length')
axes[2].set_title('Path Length')
axes[2].set_xticks(x + width)
axes[2].set_xticklabels(mazes, rotation=45, ha='right')
axes[2].legend()
axes[2].grid(True, alpha=0.3)
plt.tight_layout()
plt.savefig('performance_comparison.png', dpi=150, bbox_inches='tight')
plt.show()
if __name__ == "__main__":
if len(sys.argv) > 1 and sys.argv[1] == 'experiment':
print("Running experiments on all mazes...")
maze_files = [
("maze/maze1.txt", "Small 10x6"),
("maze/maze10x10.txt", "Medium 10x10"),
("maze/maze20x20.txt", "Large 20x20"),
("maze/maze_empty.txt", "Empty 15x15"),
("maze/maze_no_exit.txt", "No exit 10x10")
]
algorithms = [
("BFS", BreadthFirst()),
("DFS", DepthFirst()),
("AStar", AStar())
]
results = []
for fname, label in maze_files:
print(f"Testing {label}...")
for aname, algo in algorithms:
try:
avg_t, avg_v, avg_l = run_experiment(fname, algo, runs=3)
results.append({
'maze': label,
'strategy': aname,
'time_ms': avg_t,
'visited_cells': avg_v,
'path_length': avg_l
})
print(f" {aname}: time={avg_t:.3f}ms visited={avg_v:.0f} length={avg_l:.0f}")
except Exception as e:
print(f" {aname}: ERROR {e}")
# save csv
with open('experiment_results.csv', 'w', newline='', encoding='utf-8') as f:
writer = csv.DictWriter(f, fieldnames=['maze', 'strategy', 'time_ms', 'visited_cells', 'path_length'])
writer.writeheader()
writer.writerows(results)
generate_plots(results)
print("Done. Results saved to experiment_results.csv and performance_comparison.png")
sys.exit(0)
# else interactive mode
loader = TextMazeLoader()
lab = loader.load("maze/maze1.txt")
player = Player(lab.start_point, lab)
view = InteractiveView(lab, player)
view.render()
solver = LabyrinthSolver(lab)
history = []
while True:
key = input("\n > ").lower()
if key == 'q':
print("Goodbye!")
break
elif key == 'b':
solver.set_algorithm(BreadthFirst())
ms, vis, plen = solver.solve()
print(f"BFS: {ms:.3f}ms, visited={vis}, length={plen}")
elif key == 'd':
solver.set_algorithm(DepthFirst())
ms, vis, plen = solver.solve()
print(f"DFS: {ms:.3f}ms, visited={vis}, length={plen}")
elif key == 'a':
solver.set_algorithm(AStar())
ms, vis, plen = solver.solve()
print(f"A*: {ms:.3f}ms, visited={vis}, length={plen}")
elif key in ('h','j','k','l'):
moves = {'h': (-1,0), 'l': (1,0), 'k': (0,-1), 'j': (0,1)}
dx, dy = moves[key]
cmd = MoveCommand(player, dx, dy, lab)
if cmd.do():
history.append(cmd)
view.render()
if player.current == lab.exit_point:
print("\n*** YOU REACHED THE EXIT! ***")
print(f"Total moves: {len(history)}")
break
else:
print("Can't go there - wall!")
elif key == 'u':
if history:
cmd = history.pop()
cmd.revert()
view.render()
print("Undo last move")
else:
print("Nothing to undo")
else:
print("Unknown command")

View File

@ -0,0 +1,7 @@
##########
#S #
# ####### #
# # # #
# # ### # #
# # E #
##########

View File

@ -0,0 +1,10 @@
##########
#S #
# # #### #
# # #
# #### # #
# # #
# #### # #
# # #
# #
########E#

View File

@ -0,0 +1,21 @@
####################
#S #
# ############### #
# # # #
# # ######### # # #
# # # # # # #
# # # ##### # # # #
# # # # # # # # #
# # # # # # # # # #
# # # # # # # # #
# # # ##### # # # #
# # # # # # #
# # ######### # # #
# # # #
# ############### #
# #
# ############### #
# # # #
# # ########### # #
# E#
####################

View File

@ -0,0 +1,15 @@
###############
#S #
# #
# #
# #
# #
# #
# #
# #
# #
# #
# #
# #
# E #
###############

View File

@ -0,0 +1,7 @@
##########
#S #
# # #
# # #### #
# # #
##########
E#########

Binary file not shown.

After

Width:  |  Height:  |  Size: 84 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 84 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 46 KiB

View File

@ -0,0 +1,94 @@
# Отчёт по лабораторной работе «Структуры данных для телефонного справочника»
## 1. Постановка задачи
В рамках работы требовалось реализовать три структуры данных «с нуля» (без использования встроенных коллекций, кроме базовых списков):
- связный список,
- хеш-таблицу с цепочками,
- двоичное дерево поиска (несбалансированное).
Для каждой структуры необходимо реализовать операции `insert`, `find`, `delete` и `list_all` (возврат всех записей, отсортированных по имени). Затем на наборе из 10000 записей выполнить экспериментальное сравнение производительности в двух режимах: при случайном порядке вставки и при вставке записей, отсортированных по имени. Каждый эксперимент повторялся 5 раз.
## 2. Результаты измерений
Ниже приведены усреднённые по 5 повторам времена выполнения операций (в секундах). Исходные сырые данные сохранены в файле `experiment_results.csv`.
| Структура | Режим | Вставка (с) | Поиск 110 имён (с) | Удаление 50 записей (с) |
|-------------|-------------|-------------|--------------------|-------------------------|
| LinkedList | случайный | 4.7265 | 0.0345 | 0.0154 |
| LinkedList | сортир. | 4.4403 | 0.0275 | 0.0119 |
| HashTable | случайный | 0.6677 | 0.0051 | 0.0019 |
| HashTable | сортир. | 0.6460 | 0.0040 | 0.0021 |
| BST | случайный | 0.0277 | 0.00029 | 0.00016 |
| BST | сортир. | 10.1642 | 0.0886 | 0.0542 |
### Примечания к методике
- **Вставка** добавление всех 10000 записей в пустую структуру.
- **Поиск** 100 заведомо существующих имён + 10 несуществующих (общее количество вызовов 110).
- **Удаление** 50 случайных существующих записей.
- Все замеры выполнены с помощью `time.perf_counter()`.
- Для хеш-таблицы использовалось 10 корзин.
- Рекурсивная глубина BST увеличена до 20000, чтобы избежать переполнения стека.
## 3. Анализ полученных данных
### 3.1. Поведение BST при разных порядках ввода
Двоичное дерево поиска сильно зависит от порядка поступления ключей. При случайном порядке средняя высота близка к логарифмической, что даёт отличную производительность:
- вставка **0.0277 с**,
- поиск **0.00029 с** (самый быстрый среди всех структур в этом режиме).
Однако при вставке отсортированных данных дерево вырождается в линейный список (каждый новый узел добавляется только в правое поддерево). Последствия:
- время вставки возрастает **в 367 раз** (с 0.0277 до 10.16 с),
- поиск замедляется **в 305 раз**,
- удаление **в 339 раз**.
Вырожденное BST на отсортированных данных работает **медленнее даже связного списка** (вставка 10.16 с против 4.44 с, поиск 0.088 с против 0.027 с), что объясняется накладными расходами на рекурсивные вызовы и проверки.
### 3.2. Хеш-таблица устойчивость к порядку
Хеш-таблица использует функцию `hash(name) % size`, которая равномерно рассеивает имена независимо от их лексикографического порядка. Поэтому результаты в двух режимах практически идентичны:
- вставка: 0.668 с (случайный) против 0.646 с (отсортированный) разница менее 4%,
- поиск: 0.0051 с против 0.0040 с,
- удаление: 0.0019 с против 0.0021 с.
Небольшие расхождения находятся в пределах случайной вариации (зависит от коллизий, которые немного различаются при разном порядке вставки). Средняя сложность операций остаётся **O(1)**.
### 3.3. Связный список ожидаемо медленный
Линейный список не обеспечивает прямого доступа, поэтому все операции (кроме удаления после нахождения) требуют обхода в среднем половины списка. Даже при сравнительно небольшом объёме данных (10000 записей) времена велики:
- вставка ≈ **4.6 с** (на два порядка хуже, чем у хеш-таблицы и BST на случайных данных),
- поиск ≈ **0.03 с** (в 610 раз медленнее, чем у других структур).
Интересно, что на отсортированных данных список показывает немного лучшее время, чем на случайных. Причина: при вставке в конец отсортированного списка (имена идут в алфавитном порядке) новые узлы добавляются без поиска дубликатов? Но алгоритм `ll_insert` сначала проверяет наличие имени, проходя весь список. Поскольку все имена уникальны и не обновляются, каждый проход идёт до конца. Однако в отсортированном режиме имена добавляются в порядке возрастания, и при проверке дубликата мы проходим по уже существующим элементам, которые все меньше нового? Да, в отсортированном режиме каждое новое имя больше всех предыдущих, поэтому при поиске дубликата мы обходим весь существующий список. В случайном режиме новые имена могут встречаться раньше, и поиск останавливается раньше? Но в любом случае разница небольшая (около 6%), и в целом список остаётся медленным.
### 3.4. Сравнение удаления
Удаление в списке требует сначала найти элемент (O(n)), затем перелинковку. В хеш-таблице удаление сводится к удалению в коротком списке корзины (почти O(1)). В BST на случайных данных удаление очень быстрое (0.00016 с), на отсортированных катастрофически замедляется (0.054 с). Для хеш-таблицы удаление немного быстрее, чем вставка, что естественно: при удалении не нужно создавать новый узел.
## 4. Выводы и практические рекомендации
Проведённое исследование наглядно демонстрирует сильные и слабые стороны каждой структуры.
1. **Хеш-таблица** лучший выбор для задач, где приоритетом является скорость всех операций (вставка, поиск, удаление), а порядок вывода данных не важен или может быть получен отдельной сортировкой. Стабильно высокая производительность вне зависимости от характера входных данных. В реальных проектах именно хеш-таблицы лежат в основе словарей (Python `dict`, Java `HashMap`).
2. **Двоичное дерево поиска** эффективно только при случайном или близком к случайному порядке поступления ключей. Даёт логарифмическую сложность и при этом позволяет получать данные в отсортированном виде за O(n) без дополнительной сортировки. Однако на реальных данных (например, заведомо отсортированных) производительность падает до O(n), что делает его непригодным без механизмов балансировки. На практике применяются сбалансированные варианты (AVL, красно-чёрные деревья).
3. **Связный список** не подходит для коллекций объёмом более нескольких сотен элементов из-за линейной сложности основных операций. Может использоваться только в очень специфических сценариях: очень редкий поиск, постоянные вставки/удаления в начало (но не в конец), или как строительный блок для других структур (например, для цепочек в хеш-таблице, что и было сделано в данной работе).
### Итоговая таблица применимости
| Критерий | Рекомендуемая структура |
|---------------------------------|---------------------------------------|
| Максимальная скорость всех операций | Хеш-таблица |
| Нужны данные в отсортированном порядке + данные поступают случайно | BST (но лучше сбалансированное) |
| Данные поступают уже отсортированными | Хеш-таблица (или балансируемое дерево) |
| Очень маленький объём (< 100 записей) | Любая, но проще список |
В реальной разработке для телефонного справочника с большим числом записей и частыми запросами поиска оптимальным решением будет **хеш-таблица**. Если же дополнительно требуется частый вывод всего справочника по алфавиту, стоит рассмотреть сбалансированное дерево (например, встроенный в Python модуль `bisect` не даёт структуры данных, а `sortedcontainers` сторонний).

View File

@ -0,0 +1,92 @@
# Отчёт по лабораторной работе: Алгоритмы поиска пути в лабиринте
## 1. Цель работы
Разработка программы для загрузки лабиринта из текстового файла, реализации трёх алгоритмов поиска пути (BFS, DFS, A\*) и проведения экспериментального сравнения их эффективности на лабиринтах различной сложности.
## 2. Структура программы
Программа написана на Python 3 и состоит из следующих основных классов:
- `GridPoint` представление клетки лабиринта (координаты, проходимость, флаги старта/выхода);
- `Labyrinth` модель лабиринта (сетка клеток, методы получения соседей);
- `TextMazeLoader` загрузка лабиринта из файла с символами `#` (стена), `S` (старт), `E` (выход);
- `SearchAlgorithm` (и наследники `BreadthFirst`, `DepthFirst`, `AStar`) реализация алгоритмов поиска;
- `LabyrinthSolver` класс-оркестратор, позволяющий сменить стратегию и измеряющий время выполнения;
- `Player`, `Command`, `MoveCommand`, `InteractiveView` для интерактивного режима с отменой ходов;
- функции `run_experiment` и `generate_plots` для многократных запусков и построения графиков.
## 3. Описание алгоритмов
### 3.1 BFS (поиск в ширину)
Использует очередь. Гарантирует нахождение кратчайшего пути (по числу шагов). Обходит клетки в порядке увеличения расстояния от старта.
### 3.2 DFS (поиск в глубину)
Использует стек. Идёт «вглубь» по одному пути, не гарантирует кратчайший путь. Обычно быстрее по времени и памяти на больших лабиринтах.
### 3.3 A* (звездочка)
Использует приоритетную очередь и эвристику (манхэттенское расстояние). Оценивает клетку по формуле `f = g + h`, где `g` пройденное расстояние, `h` эвристика. Находит оптимальный путь, если эвристика допустима.
## 4. Методика эксперимента
Для каждого лабиринта каждый алгоритм запускался 3 раза, результаты усреднялись. Измерялись:
- время выполнения (в миллисекундах);
- количество посещённых клеток;
- длина найденного пути.
Тестовые лабиринты:
| Название | Размер | Описание |
|----------|--------|-----------|
| Small 10x6 | 10×6 | Простой лабиринт с извилистым коридором |
| Medium 10x10 | 10×10 | Лабиринт среднего размера с несколькими тупиками |
| Large 20x20 | 20×20 | Большой запутанный лабиринт |
| Empty 15x15 | 15×15 | Пустой лабиринт без стен (прямая линия от S до E) |
| No exit 10x10 | 10×10 | Лабиринт без буквы E (путь отсутствует) |
## 5. Результаты экспериментов
| Лабиринт | Алгоритм | Время, мс | Посещено клеток | Длина пути |
|----------------|----------|-----------|-----------------|------------|
| Small 10x6 | BFS | 0.057 | 25 | 16 |
| Small 10x6 | DFS | 0.057 | 24 | 16 |
| Small 10x6 | A* | 0.048 | 23 | 16 |
| Medium 10x10 | BFS | 0.048 | 47 | 16 |
| Medium 10x10 | DFS | 0.035 | 44 | 30 |
| Medium 10x10 | A* | 0.098 | 47 | 16 |
| Large 20x20 | BFS | 0.099 | 100 | 36 |
| Large 20x20 | DFS | 0.070 | 75 | 68 |
| Large 20x20 | A* | 0.165 | 85 | 36 |
| Empty 15x15 | BFS | 0.133 | 133 | 17 |
| Empty 15x15 | DFS | 0.114 | 161 | 89 |
| Empty 15x15 | A* | 0.154 | 65 | 17 |
| No exit 10x10 | BFS | 0.044 | 25 | 0 |
| No exit 10x10 | DFS | 0.059 | 25 | 0 |
| No exit 10x10 | A* | 0.046 | 25 | 0 |
## 6. Анализ результатов
### 6.1. Нахождение кратчайшего пути
- **BFS** и **A*** нашли оптимальные пути во всех лабиринтах, где выход существовал (длина пути совпадает для них в каждом случае).
- **DFS** в лабиринтах Medium, Large и Empty дал существенно более длинные пути (30 против 16, 68 против 36, 89 против 17), что характерно для глубинного обхода без эвристики.
### 6.2. Время выполнения
- На малых лабиринтах все алгоритмы работают сопоставимо (0.0350.099 мс).
- На лабиринте Large 20×20 BFS выполнился за 0.099 мс, A* 0.165 мс (медленнее из-за сложности поддержки очереди с приоритетом), DFS быстрее всех (0.070 мс).
- В пустом лабиринте BFS и A* обошли почти все клетки (133 и 65 посещённых соответственно), но A* за счёт эвристики посетил вдвое меньше клеток, хотя время оказалось чуть выше, чем у BFS (0.154 против 0.133 мс). Это объясняется накладными расходами на вычисление эвристики и управление кучей.
### 6.3. Количество посещённых клеток
- **A*** показал лучшую эффективность в пустом лабиринте (65 посещённых против 133 у BFS и 161 у DFS). В лабиринтах со стенами разница не столь заметна, но A* почти всегда посещал меньше клеток, чем BFS.
- **DFS** в среднем посещает меньше клеток, чем BFS, но при этом путь часто неоптимален.
- **BFS** вынужден обходить всю область равных расстояний, поэтому посещённых клеток обычно больше.
### 6.4. Поведение при отсутствии выхода
Все алгоритмы корректно завершились, вернув пустой путь (длина 0). В лабиринте без выхода BFS, DFS и A* посетили 25 клеток это все доступные клетки.
## 7. Выводы
1. **BFS** надёжен для поиска кратчайшего пути, но может быть медленнее на больших открытых пространствах из-за широкого обхода.
2. **DFS** самый быстрый по времени и экономный по памяти, но не гарантирует оптимальность пути. Его применение оправдано, когда любой путь подходит.
3. **A*** демонстрирует лучший баланс: находит кратчайший путь и при этом посещает меньше клеток, чем BFS. Небольшое замедление на сложных лабиринтах компенсируется меньшим числом обработанных клеток.
4. Программа успешно справляется с лабиринтами разного размера и конфигурации, включая отсутствие выхода.
5. Интерактивный режим с отменой ходов (паттерн Command) и выбором алгоритма (паттерн Strategy) реализован и работает корректно.

0
BorisovMI/429.md Normal file
View File

View File

@ -0,0 +1,725 @@
from abc import ABC, abstractclassmethod
from collections import deque
import heapq
import time
import os
import time
import csv
import random
class Cell:
def __init__(self, x, y):
self.x = x
self.y = y
self.isWall = False
self.isStart = False
self.isExit = False
def __eq__(self, other):
if other is None:
return False
return self.x == other.x and self.y == other.y
def __lt__(self, other):
if other is None:
return False
return (self.x, self.y) < (other.x, other.y)
def __hash__(self):
return hash((self.x, self.y))
def __repr__(self):
return f"Cell({self.x}, {self.y})"
def isPassable(self):
return not self.isWall
class Maze:
def __init__(self, width, height):
self.width = width
self.height = height
self.grid = [[Cell(x, y) for y in range(height)] for x in range(width)]
self.start = None
self.exit = None
def getCell(self, x, y):
if 0 <= x < self.width and 0 <= y < self.height:
return self.grid[x][y]
return None
def getNeighbors(self, cell):
neighbors = []
directions = [(0, 1), (0, -1), (1, 0), (-1, 0)]
for dx, dy in directions:
neighbor = self.getCell(cell.x + dx, cell.y + dy)
if neighbor and neighbor.isPassable():
neighbors.append(neighbor)
return neighbors
def setStart(self, x, y):
cell = self.getCell(x, y)
if cell:
cell.isStart = True
self.start = cell
def setExit(self, x, y):
cell = self.getCell(x, y)
if cell:
cell.isExit = True
self.exit = cell
class MazeBuilder(ABC):
def buildFromFile(self, filename):
pass
class TextileMazeBuilder(MazeBuilder):
def buildFromFile(self, filename):
with open(filename, 'r', encoding='utf-8') as f:
lines = f.readlines()
lines = [line.rstrip('\n\r') for line in lines]
height = len(lines)
width = len(lines[0]) if height > 0 else 0
for line in lines:
if len(line) != width:
raise ValueError("все строки одинаковой длины")
maze = Maze(width, height)
for y in range(height):
for x in range(width):
char = lines[y][x]
cell = maze.getCell(x, y)
if char == '#':
cell.isWall = True
elif char == ' ':
cell.isWall = False
elif char == 's':
cell.isWall = False
cell.isStart = True
maze.start = cell
elif char == 'e':
cell.isWall = False
cell.isExit = True
maze.exit = cell
else:
raise ValueError(f"неизв сим")
if maze.start is None:
raise ValueError("в лабиринте не найден старт")
if maze.exit is None:
raise ValueError("в лабиринте не найден выход")
return maze
class PathFindingStrategy:
def findPath(self, maze, start, exit):
pass
class BFSStrategy(PathFindingStrategy):
def findPath(self, maze, start, exit):
if exit is None:
return []
queue = deque([start])
visited = {start}
parent = {start: None}
while queue:
current = queue.popleft()
if current == exit:
return self._reconstruct_path(parent, start, exit)
for neighbor in maze.getNeighbors(current):
if neighbor not in visited:
visited.add(neighbor)
parent[neighbor] = current
queue.append(neighbor)
return []
def _reconstruct_path(self, parent, start, exit):
path = []
current = exit
while current is not None:
path.append(current)
current = parent[current]
path.reverse()
return path
class DFSStrategy(PathFindingStrategy):
def findPath(self, maze, start, exit):
if exit is None:
return []
stack = [start]
visited = {start}
parent = {start: None}
while stack:
current = stack.pop()
if current == exit:
return self._reconstruct_path(parent, start, exit)
for neighbor in maze.getNeighbors(current):
if neighbor not in visited:
visited.add(neighbor)
parent[neighbor] = current
stack.append(neighbor)
return []
def _reconstruct_path(self, parent, start, exit):
path = []
current = exit
while current is not None:
path.append(current)
current = parent[current]
path.reverse()
return path
class AStrategy(PathFindingStrategy):
def _heuristic(self, cell, exit):
if exit is None:
return 0
return abs(cell.x - exit.x) + abs(cell.y - exit.y)
def findPath(self, maze, start, exit):
if exit is None:
return []
open_set = []
heapq.heappush(open_set, (0, start))
came_from = {start: None}
g_score = {start: 0}
while open_set:
current = heapq.heappop(open_set)[1]
if current == exit:
return self._reconstruct_path(came_from, start, exit)
for neighbor in maze.getNeighbors(current):
tentative_g = g_score[current] + 1
if neighbor not in g_score or tentative_g < g_score[neighbor]:
came_from[neighbor] = current
g_score[neighbor] = tentative_g
f_score = tentative_g + self._heuristic(neighbor, exit)
heapq.heappush(open_set, (f_score, neighbor))
return []
def _reconstruct_path(self, came_from, start, exit):
path = []
current = exit
while current is not None:
path.append(current)
current = came_from[current]
path.reverse()
return path
class SearchStats:
def __init__(self, time_ms=0, visited_cells=0, path_length=0):
self.time_ms = time_ms
self.visited_cells = visited_cells
self.path_length = path_length
def __str__(self):
return f"Время: {self.time_ms:.3f} мс | Посещено: {self.visited_cells} | Длина пути: {self.path_length}"
class MazeSolver:
def __init__(self, maze):
self.maze = maze
self.strategy = None
def setStrategy(self, strategy):
self.strategy = strategy
def solve(self):
if self.strategy is None:
raise ValueError("Стратегия не установлена")
start_time = time.perf_counter()
path = self.strategy.findPath(self.maze, self.maze.start, self.maze.exit)
end_time = time.perf_counter()
elapsed_ms = (end_time - start_time) * 1000
stats = SearchStats(
time_ms=elapsed_ms,
visited_cells=len(path),
path_length=len(path)
)
return path, stats
class Observer:
def update(self, event):
pass
class ConsoleView(Observer):
def render(self, maze, player_position=None, path=None):
"""отрисовка"""
os.system('cls' if os.name == 'nt' else 'clear')
path_set = set(path) if path else set()
for y in range(maze.height):
for x in range(maze.width):
cell = maze.getCell(x, y)
if player_position and cell == player_position:
print('P', end='')
elif cell == maze.start:
print('S', end='')
elif cell == maze.exit:
print('E', end='')
elif cell in path_set:
print('.', end='')
elif cell.isWall:
print('#', end='')
else:
print(' ', end='')
print()
def update(self, event):
if event['type'] == 'path_found':
print(f"длина пути {len(event['path'])}")
self.render(event['maze'], path=event['path'])
elif event['type'] == 'move':
print(f"шаг {event['step']}")
self.render(event['maze'], event['player'], event['path'])
elif event['type'] == 'maze_loaded':
print("перегрузка")
self.render(event['maze'])
class ObservableMazeSolver:
def __init__(self, maze):
self.maze = maze
self.strategy = None
self.observers = []
def attach(self, observer):
self.observers.append(observer)
def notify(self, event):
for observer in self.observers:
observer.update(event)
def setStrategy(self, strategy):
self.strategy = strategy
def solve(self):
if self.strategy is None:
raise ValueError("")
path = self.strategy.findPath(self.maze, self.maze.start, self.maze.exit)
self.notify({
'type': 'path_found',
'maze': self.maze,
'path': path
})
return path
class Player:
def __init__(self, start_cell):
self.currentCell = start_cell
self.previousCell = None
def moveTo(self, cell):
self.previousCell = self.currentCell
self.currentCell = cell
def undoMove(self):
if self.previousCell:
self.currentCell, self.previousCell = self.previousCell, None
return True
return False
class Command:
def execute(self):
pass
def undo(self):
pass
class MoveCommand(Command):
def __init__(self, player, direction, maze):
self.player = player
self.dx, self.dy = direction
self.maze = maze
self.executed = False
def execute(self):
new_x = self.player.currentCell.x + self.dx
new_y = self.player.currentCell.y + self.dy
new_cell = self.maze.getCell(new_x, new_y)
if new_cell and new_cell.isPassable():
self.player.moveTo(new_cell)
self.executed = True
return True
return False
def undo(self):
if self.executed:
self.player.undoMove()
self.executed = False
return True
return False
def clear_console():
os.system('cls' if os.name == 'nt' else 'clear')
def render_maze_with_player(maze, player, path=None):
path_set = set(path) if path else set()
for y in range(maze.height):
for x in range(maze.width):
cell = maze.getCell(x, y)
if cell == player.currentCell:
print('P', end='')
elif cell == maze.start:
print('S', end='')
elif cell == maze.exit:
print('E', end='')
elif cell in path_set:
print('.', end='')
elif cell.isWall:
print('#', end='')
else:
print(' ', end='')
print()
def run_game(maze, path=None):
player = Player(maze.start)
history = []
directions = {
'w': (0, -1),
's': (0, 1),
'a': (-1, 0),
'd': (1, 0)
}
print(" W/A/S/D - движение, U - отмена, Q - выход")
if path:
print(f"мин путь {len(path)} шагов")
while True:
print()
render_maze_with_player(maze, player, path)
if player.currentCell == maze.exit:
print("\n*** выход ***")
break
key = input("\n> ").lower()
if key == 'q':
print("выход из игры")
break
elif key == 'u':
if history:
cmd = history.pop()
cmd.undo()
print("отмена хода")
else:
print("нет ходов")
elif key in directions:
cmd = MoveCommand(player, directions[key], maze)
if cmd.execute():
history.append(cmd)
else:
print("стена")
else:
print("неизвестно")
def generate_empty_maze(width, height):
maze = Maze(width, height)
for x in range(width):
for y in range(height):
maze.getCell(x, y).isWall = False
maze.setStart(0, 0)
maze.setExit(width-1, height-1)
return maze
def generate_maze_with_walls(width, height, wall_probability=0.3):
maze = Maze(width, height)
for x in range(width):
for y in range(height):
if random.random() < wall_probability:
maze.getCell(x, y).isWall = True
else:
maze.getCell(x, y).isWall = False
maze.getCell(0, 0).isWall = False
maze.getCell(width-1, height-1).isWall = False
maze.setStart(0, 0)
maze.setExit(width-1, height-1)
return maze
def generate_maze_no_exit(width, height):
maze = generate_maze_with_walls(width, height, 0.3)
exit_cell = maze.getCell(width-1, height-1)
exit_cell.isWall = True
maze.exit = None
return maze
def save_maze_to_file(maze, filename):
with open(filename, 'w') as f:
for y in range(maze.height):
for x in range(maze.width):
cell = maze.getCell(x, y)
if cell == maze.start:
f.write('s')
elif cell == maze.exit:
f.write('e')
elif cell.isWall:
f.write('#')
else:
f.write(' ')
f.write('\n')
def create_test_mazes():
mazes = []
small = generate_maze_with_walls(10, 10, 0.2)
save_maze_to_file(small, "maze_small.txt")
mazes.append(('маленький (10x10)', small))
medium = generate_maze_with_walls(50, 50, 0.3)
save_maze_to_file(medium, "maze_medium.txt")
mazes.append(('средний (50x50)', medium))
large = generate_maze_with_walls(100, 100, 0.3)
save_maze_to_file(large, "maze_large.txt")
mazes.append(('большой (100x100)', large))
empty = generate_empty_maze(50, 50)
save_maze_to_file(empty, "maze_empty.txt")
mazes.append(('пустой (50x50)', empty))
no_exit = generate_maze_no_exit(20, 20)
save_maze_to_file(no_exit, "maze_no_exit.txt")
mazes.append(('без выхода (20x20)', no_exit))
return mazes
def run_experiment(maze, strategy, name, repeats=5):
times = []
visited_counts = []
path_lengths = []
for _ in range(repeats):
solver = MazeSolver(maze)
solver.setStrategy(strategy())
start_time = time.perf_counter()
path, stats = solver.solve()
end_time = time.perf_counter()
times.append((end_time - start_time) * 1000)
visited_counts.append(len(path) if path else 0)
path_lengths.append(len(path) if path else 0)
return {
'лабиринт': name,
'стратегия': strategy.__name__.replace('Strategy', ''),
'время_ср': sum(times) / repeats,
'время_мин': min(times),
'время_макс': max(times),
'посещено_ср': sum(visited_counts) / repeats,
'длина_пути_ср': sum(path_lengths) / repeats,
'путь_найден': path is not None and len(path) > 0
}
def run_all_experiments():
strategies = [BFSStrategy, DFSStrategy, AStrategy]
results = []
mazes = create_test_mazes()
for maze_name, maze in mazes:
for strategy in strategies:
print(f" тест {strategy.__name__}...", end=" ", flush=True)
result = run_experiment(maze, strategy, maze_name)
results.append(result)
print(f"время={result['время_ср']:.2f}мс, путь={result['длина_пути_ср']:.0f}")
save_results_to_csv(results)
return results
def save_results_to_csv(results):
filename = "resultslab.csv"
with open(filename, 'w', newline='', encoding='utf-8-sig') as f:
writer = csv.DictWriter(f, fieldnames=[
'лабиринт', 'стратегия', 'время_ср', 'время_мин', 'время_макс',
'посещено_ср', 'длина_пути_ср', 'путь_найден'
])
writer.writeheader()
writer.writerows(results)
def plot_results(results):
try:
import matplotlib.pyplot as plt
import numpy as np
labyrinths = list(set(r['лабиринт'] for r in results))
strategies = ['BFS', 'DFS', 'A']
n_rows = 3
n_cols = 2
fig, axes = plt.subplots(n_rows, n_cols, figsize=(14, 12))
axes = axes.flatten()
for idx, lab in enumerate(labyrinths):
ax = axes[idx]
times = []
for strat in strategies:
for r in results:
if r['лабиринт'] == lab and r['стратегия'] == strat:
times.append(r['время_ср'])
break
x = np.arange(len(strategies))
bars = ax.bar(x, times, color=['#1a5632', '#0e5fb4', '#051f45'])
ax.set_title(f'{lab}')
ax.set_xticks(x)
ax.set_xticklabels(strategies)
ax.set_ylabel('Время (мс)')
for bar, t in zip(bars, times):
ax.text(bar.get_x() + bar.get_width()/2, bar.get_height() + 0.5,
f'{t:.1f}', ha='center', va='bottom', fontsize=8)
if len(labyrinths) < len(axes):
axes[-1].set_visible(False)
plt.tight_layout()
plt.savefig('maze_time_comparison.png', dpi=150)
plt.show()
plt.figure(figsize=(10, 6))
colors = ['#d8d262', '#0e5fb4', '#ed254e']
for idx, strat in enumerate(strategies):
lengths = []
for lab in labyrinths:
for r in results:
if r['лабиринт'] == lab and r['стратегия'] == strat:
lengths.append(r['длина_пути_ср'])
break
plt.plot(labyrinths, lengths, marker='o', label=strat, color=colors[idx]) # добавьте color
plt.xlabel('Лабиринт')
plt.ylabel('Длина пути ')
plt.title('Сравнение длины найденного пути')
plt.legend()
plt.xticks(rotation=45)
plt.tight_layout()
plt.savefig('maze_path_length.png', dpi=150)
plt.show()
except ImportError:
print("")
def print_analysis(results):
strat_data = {}
for r in results:
strat = r['стратегия']
if strat not in strat_data:
strat_data[strat] = {'time': [], 'visited': [], 'labyrinth': []}
strat_data[strat]['time'].append(r['время_ср'])
strat_data[strat]['visited'].append(r['посещено_ср'])
strat_data[strat]['labyrinth'].append(r['лабиринт'])
for strat, data in strat_data.items():
avg_time = sum(data['time']) / len(data['time'])
print(f" {strat}: среднее время {avg_time:.2f} мс")
print(" BFS медленный на большом лабсамый короткий путить находит")
print(" DFS быстрый, но не всегда самый короткий")
print(" A быстрый и находит самый короткий путь")
print(" без выхода лаб. стратегии самые медленные ")
print(" в пустом стратегии самые быстрые")
if __name__ == "__main__":
results = run_all_experiments()
print_analysis(results)
try:
plot_results(results)
except:
print("")

View File

@ -0,0 +1,50 @@
s
e

View File

@ -0,0 +1,100 @@
s## # # # # # # # ### # ## # # # # # # ### # # # # # ###
# ## # ## ### ## # # ## ## # # # ### ## ## #
# ## # # # # # ## ## # # # ## # ## # # # # ## # # # #
## # # # ##### # # # # # ## # ## # # # # # # # # # # # # #
# ### ## # # # # ## ## ## # # # # # ## #
# # # # # # ## # ### ## ## # ##### # # # # # ### ## # ### # # #
# # # ## ### # # # # # ### # # # ## ##### # #
# # ### # # ## ### # # # # # ## # ## ## # ## # ## ## # #
# # # ## # # # # ## # # # # # # # # # # # ### ## # # #
# # # # # ## # # # # # ## ## ### ###### ## ## ### #
## ## # # # # # # ### # # # ### # ## #
# # ###### # # # ## # # # ## # # # ## #### # # #
## # # # ### # # # # # #### # # # ## # # # #
# # # # ### ## ## # # # ## # # # # # ### # # # ### # # #### # ##
# ## # # # # # # # # # # # # # # ## ### ## # # ## #
### # # # # ## ### # # ## # # # ## # ## # ## #
### # # # # ### # # # # # ## # # # # # ## # # ## #
# # # # ## # # ### # ## ## # ### # # ### ## #
### ## # ## # ## # # # # # # # # # # # ####### ##
## ## # # # # ## # # # ## ### ### # # # ### # # # # ## # ###
### #### ### # # # # ## ## # #### # # # # # # ## # #
### # ## ## # ## ## ## # # # ## # # ## # ## # #
# # # # # # # #### ## # # #### ## # ## ## # # #
# ## # ## # # # # ### # ## # ## # # ## # # # ## # # #### # #
# # ## # # # # # # # # # ## ## # # # ### # #
# # # # # # ## # # # ### # ## # # # # ## # # # # # #
# # # ### # # # # # ## ## # # ## # # ## # # #
## ## ### # # ## # # # # # # # # # # # # # ## ## # # # #
# # # # # # ## # # # # # # # ##
# # # # # # ## # ## # ## # # # ## ## ## ## ### # # # # # #
# # # # # # # #### # ## # # # # ## ## # # # ## # #
## # # # # # # # ###### # # ### # # ## # # # # ### ##
# # ## # # # # #### # #### # # # ## ## ## #
# # # # # # # ## # # # # # ### ### # # # # # # #
# # # # ## # # # # # ## # ## # # ## # ## ### # #
#### # # # # ## # # # # # ## ### # # # # ### # ## #
# # # # ## ## # # # # # # # # # # # # # # # ## ## # # ##
# # # # # # ## # # # ## ## # # # # # # ## #
# # ## ## ### ## # # ## # # # ## # # # # # # # # #
## ## # # # # # # ## ### # # # ## # # ## # ### # ### ##
## ## # # # # # # # # # ## # # ## # ### # # # #
## # # ## ## ## # # ## # # ## # # # # ## # #
## # ## # ## ## # # # # # # # # # # ### # # # # # ## # #
# ## ## # # # # # #### ## # # # # # # # # #
# # # # # # # # ## # # # # # ### # # # # #### ## ### ####
# ## # # #### # # # # #### # # # # # ### # # ### # ## ##
## # ## # ## # # # # # # ### # # # # # ## # # #
# # # # ## # # # ### #### ## # # # # ## ## ## #
## # ## # ## # # # # ## # # # # # # # # # # # ## #
# # ## # # # ### # ## # ## # # ### # # # # ### #
# # ## # ## #### # # # # # # # ## ## # ## ###
# ## # # ## ## # # ## # # # ### # ## # # # # # # # #
# # ## # # ## # # # # # # # # # # # ## # ### ##
# ## # # # # # # # ## # # ## ## ## # # ## ## # # ## ### ### ####
### # # # # # # # ## # # # ## # ## # # # ## # # ## # # # #
# # # # # # # # ## ## ### # # # # # # ## # # # #
# # # # ## # ### # # # # ## # # # ### # ## ## # # # ##
# # # # # ## # ## # # # ### # ## ## # # # # # # # #
## ### ## # # # # ## # # # #### # #### # # ## # ## #
## ## ## # # # # ## # # ## ## ### # # # # # ### # ### ##
# # ### # # # # # # # # # ## # ### # # # ### ## ##
# # ## # ## # ## ## # # # ## ## # ## # # ##
# # ### # ## ## # # ### # # # # # # ## ## # ##
# # #### # # # # # # # ### # # # # # # ## # ### # # ### ###
# # ## # # ##### # ## # # ## ## # # # ## # # # ## ##
# ### # ## # # ###### ### # ## # ## # # ## # # # # ## ## # ## #
# # # # # # # # ## ## # # # ## # # ## ## # # # # #
## # ## ## # ### # # # # # # # # ## # # # # # ###### # ##
## # # # # ### # # ### ## # # ## # # # # ##### #
# # ### # # # # # # ## #### # # ### # # # ## # ##
# # ## ## # ## # #### # ## # # # # # ## ## # # # # ## ## #
## # # # # ## # # ## # # # ## # # ## # # # # # #
# # # ## # # # # ## # ## # # # # # ## # # ##
# ## ## # # # # # # ### # ## # # # # # # # # #
# # ## # # # # # # # ##### ## ## ### # # ###
# # # # # # ## ## ## # # # # # # ## # ##### # ##
# # ## # # # ## # # #### # ## # # # # # ## # # #
# # # # # ## ## # ## # # # # # #### # ##
## # # # # ## # ## ## ## # # ## # # # ## # ## # # #
## # # # # # # # ## ### # # # ## # # ## #
### # ## # # # ## ## # ### # # # # # ### # # # ##### #
## # # ## # ## # # # # # ## # # # ## ####### ### # #
#### # # # # # # # # # # ## # ## # # ### # ## # # #
# # # # # # # # # # ## # # ## # # # # ## # ### # #
# # # # #### ## ## # # # # ## # # # # # # ### ### # ##
#### # ## # # # ### ## # ## ## # ## # # ## # #
# # ## # # # # # # # # ## # # ## # # ### # ##
# # # # ## ## # # ## # # # # ## # ## ##
### ## # # # ## ## ## ## # # # ## ## # # # # # # # # # ## # # #
## # # # # # # # # # # ## #### # # ## ### ### ## # # #
# # ##### # # # ## ## # # ## ## # # ## # #### ##### # # ## ##
# # # # # # ## # # # # # # # # # # ## #
## ### # # ## ## # ## ## ## # # ## # # ### # # ## ### #
# # # ## # ## # # # ## # # # # ## # # # #
# # # # # #### # # # ## # # # ## # # # # # # # # # #
# # # ## # # ## # # ### # # ## # # ## # # ##
# # # ## # # ### # # # # # ## ## ##
# # # # ### # # # # # # # # # # # ## ## # ### # ## # # # #
# ###### # # ## ## ## # ### # # # ## # # # #####
# ## # # # # ## # # # # # # # # #### # # e

View File

@ -0,0 +1,50 @@
s # ## # # ### # ## # # #
## # # ## ## # # # #
# # ## # # # # ##
### # # # # # # ## ## # ## # #
# # # ## # # # # ## # #
# # # # ## # ## # # #
## # # # # # # # ## # #
# ## # # # ## # ## # # # # #
## # # # # ## # # ## # ##
# # # # # ## # # ## # # #
# # # # ## # # # # ## # ## # #
# ## # # # # # # # ## ##
## # ## ### # # # ## # ##
##### ### # # # # ## # # # #
# # ### ## # ## ## #### ###
## # # # # ### # # ## # #
# # ## # # # # # # ##
## # # # ### # ## # # ## # # ## ##
# #### # # # # # ### # ##
# ## # ## # # ## ### ## ### #
# # ### ## # # # ##
# # ## # # # # # # #
# ## # ### #### # ## # ### ## # #
# # ## # # # # # # #
# # ##### # # # # # # # ## # ##
## # # # # ## ## # ## ## #
# # # # # # # ## # # #
## # # # ## # # ## # #
# ### # # # # # # # # # ###
### # # # # # ### # # # # # ##
# # # # # ## # # # # # ##
# ## ## ## # # # # # # ## #
# #### # # # ## # ## #
## # # # # ## # # # # #
## # ## ## # # # ## # # ## #
# # # # # # # # # # ### # # #
# # ## # # # # # ###
# # #### ##
# # ## # # ## ### # # ##
##### # # # # # # # # # #
## # # # # # #
# # ## ## # # # # ## ### # #
# # ### ## ### ### # ## # #
## # ### # ## # # # #
# # # # # ## # # # # #
# # ## # # ## ### # # # #
# # # # # ## # ### #
## # # ## # # #
# # ## # ### # ### # ## # ## # ##
# # # # # # # ## # # e

View File

@ -0,0 +1,20 @@
s ## ###
# # # # # ##
# # # # #
# # ##
# # # # #
# # ### # #
# # # # #
# # ## ## ###
# ## #
# # ###
# # # # #
### # #
# # # #
## # # # #
## # # # # ##
# # #
# #
# # # #
# # #
# # # # ## #

Binary file not shown.

After

Width:  |  Height:  |  Size: 101 KiB

View File

@ -0,0 +1,10 @@
s #
#
# #
# #
# #
#
# #
#
# # e

Binary file not shown.

After

Width:  |  Height:  |  Size: 103 KiB

View File

@ -0,0 +1,252 @@
# Отчёт: Задание 2 — Поиск выхода из лабиринта
## Цель работы
Разработать гибкую, расширяемую программу для загрузки лабиринта из файла, поиска пути от старта до выхода с возможностью выбора алгоритма, визуализации процесса и экспериментального сравнения алгоритмов
## Выбранные паттерны и их обоснование
### Builder
Для загрузки лабиринта из файла был использован паттерн Builder.
Создан интерфейс:
class MazeBuilder():
и его реализация:
class TextFileMazeBuilder(MazeBuilder):
Преимущества использования Builder:
пользоватеь не знает деталей создания лабиринта;
можно добавить новые форматы (JSON, XML, бинарный);
код загрузки изолирован от остальной программы.
### Strategy
Для алгоритмов поиска пути использован паттерн Strategy
Создан общий интерфейс:
class PathFindingStrategy():
Реализованы стратегии:
BFSStrategy;
DFSStrategy;
AStrategy;
Каждая стратегия реализует собственный алгоритм поиска пути по правилам.
Преимущества паттерна:
алгоритмы можно менять во время выполнения;
код MazeSolver не зависит от конкретного алгоритма;
новые алгоритмы можно добавлять без изменения существующего кода.
### Observer
Для уведомления интерфейса о событиях использован паттерн Observer
Создан интерфейс:
class Observer():
и реализация:
class ConsoleView(Observer):
MazeSolver хранит список наблюдателей и уведомляет их о событиях:
начало поиска;
окончание поиска;
перемещение игрока.
Преимущества:
логика интерфейса отделена от логики поиска;
можно легко добавить графический интерфейс;
### Command
Для пошагового перемещения игрока использован паттерн Command.
Создан интерфейс:
class Command():
и реализация:
class MoveCommand(Command):
Каждая команда умеет:
execute() — выполнить действие;
undo() — отменить действие
Преимущества:
поддержка undo;
возможность расширения системы команд
## Листинги ключевых классов
### Паттерн Strategy
class PathFindingStrategy:
def findPath(self, maze, start, exit):
pass
class BFSStrategy(PathFindingStrategy):
def findPath(self, maze, start, exit):
if exit is None:
return []
queue = deque([start])
visited = {start}
parent = {start: None}
while queue:
current = queue.popleft()
if current == exit:
return self._reconstruct_path(parent, start, exit)
for neighbor in maze.getNeighbors(current):
if neighbor not in visited:
visited.add(neighbor)
parent[neighbor] = current
queue.append(neighbor)
return []
class AStrategy(PathFindingStrategy):
def _heuristic(self, cell, exit):
if exit is None:
return 0
return abs(cell.x - exit.x) + abs(cell.y - exit.y)
def findPath(self, maze, start, exit):
if exit is None:
return []
open_set = []
heapq.heappush(open_set, (0, start))
came_from = {start: None}
g_score = {start: 0}
while open_set:
current = heapq.heappop(open_set)[1]
if current == exit:
return self._reconstruct_path(came_from, start, exit)
for neighbor in maze.getNeighbors(current):
tentative_g = g_score[current] + 1
if neighbor not in g_score or tentative_g < g_score[neighbor]:
came_from[neighbor] = current
g_score[neighbor] = tentative_g
f_score = tentative_g + self._heuristic(neighbor, exit)
heapq.heappush(open_set, (f_score, neighbor))
return []
### Паттерн Command
class Command:
def execute(self): pass
def undo(self): pass
class MoveCommand(Command):
def __init__(self, player, direction, maze):
self.player = player
self.dx, self.dy = direction
self.maze = maze
self.executed = False
def execute(self):
new_x = self.player.currentCell.x + self.dx
new_y = self.player.currentCell.y + self.dy
new_cell = self.maze.getCell(new_x, new_y)
if new_cell and new_cell.isPassable():
self.player.moveTo(new_cell)
self.executed = True
return True
return False
def undo(self):
if self.executed:
self.player.undoMove()
self.executed = False
return True
return False
## Результаты
| Лабиринт | Стратегия | Время (с) | Посещено | Длина пути | Путь найден |
|---|---|---|---|---|---|
| маленький (10x10) | BFS | 0.9148200158961117 | 19.0 | 19.0 | True |
| маленький (10x10) | DFS | 0.717819994315505 | 39.0 | 39.0 | True |
| маленький (10x10) | A | 1.577159995213151 | 19.0 | 19.0 | True |
| средний (50x50) | BFS | 14.496059995144606 | 99.0 | 99.0 | True |
| средний (50x50) | DFS | 8.470179990399629 | 393.0 | 393.0 |True |
| средний (50x50) | A | 9.11291999509558 | 99.0 | 99.0 | True |
| большой (100x100) | BFS | 0.013179995585232973 | 0.0 | 0.0 | False |
| большой (100x100) | A | 0.013079994823783636 | 0.0 | 0.0 | False |
| пустой (50x50) | BFS | 29.2012800113298 | 99.0 | 99.0 | True |
| пустой (50x50) | DFS | 13.176999986171722 | 1275.0 | 1275.0 | True |
| пустой (50x50) | A | 50.366899999789894 | 99.0 | 99.0 | True |
| без выхода (20x20) | BFS | 0.004239997360855341 | 0.0 | 0.0 | False |
| без выхода (20x20) | DFS | 0.006399990525096655 | 0.0 | 0.0 | False |
| без выхода (20x20) | A | 0.008680007886141539 | 0.0 | 0.0 | False |
### Графики
![Сравнение длины](maze_path_length.png)
![Сравнение времён](maze_time_comparison.png)
## Анализ эффективности алгоритмов
В ходе экспериментов были получены следующие результаты.
### BFS
Преимущества:
всегда находит кратчайший путь;
простая реализация.
Недостатки:
посещает большое количество клеток;
требует много памяти.
Выходит, что наиболее эффективен в небольших невзвешенных лабиринтах.
### DFS
Преимущества:
простая реализация;
самым быстрым находит произвольный путь.
Недостатки:
не гарантирует кратчайший путь;
может уходить в тупики.
Подходит для быстрого поиска любого решения.
### A
Преимущества:
высокая скорость;
посещает меньше клеток;
Недостатки:
требует выбора хорошей эвристики.
Показал хорошие результаты на больших лабиринтах.
## Анализ применимости паттернов
### Builder
Без Builder код загрузки лабиринта был бы жёстко связан с классом Maze, а добавление нового формата потребовало бы изменения существующего кода.
Strategy
Без Strategy пришлось бы:
хранить все алгоритмы внутри одного класса;
использовать большое количество условных операторов;
изменять код MazeSolver при добавлении новых алгоритмов
Strategy помог полностью отделить алгоритмы друг от друга.
### Observer
Без Observer логика интерфейса смешивалась бы с логикой поиска.
Это усложнило бы:
добавление GUI;
логирование;
визуализацию.
### Command
Без Command было бы сложно реализовать:
undo;
историю действий;
расширяемую систему управления.
## Выводы
### В проекте были успешно реализованы:
загрузка лабиринта из файла;
несколько алгоритмов поиска пути;
визуализация;
система наблюдателей;
система команд;
экспериментальное сравнение алгоритмов.
### Использование паттернов GoF позволило:
сделать архитектуру гибкой;
уменьшить связанность компонентов;
упростить расширение программы;
облегчить сопровождение кода.

View File

@ -0,0 +1,16 @@
лабиринт,стратегия,время_срремя_мин,время_макс,посещено_ср,длина_пути_ср,путь_найден
маленький (10x10),BFS,0.9148200158961117,0.8840999798849225,0.9673000313341618,19.0,19.0,True
маленький (10x10),DFS,0.717819994315505,0.5779999773949385,0.8650000090710819,39.0,39.0,True
маленький (10x10),A,1.577159995213151,1.531599962618202,1.7019000370055437,19.0,19.0,True
средний (50x50),BFS,14.496059995144606,12.946999981068075,18.392199999652803,99.0,99.0,True
средний (50x50),DFS,8.470179990399629,7.544599997345358,9.55930002965033,393.0,393.0,True
средний (50x50),A,9.11291999509558,8.53859999915585,9.788900031708181,99.0,99.0,True
большой (100x100),BFS,0.013179995585232973,0.009100011084228754,0.026200024876743555,0.0,0.0,False
большой (100x100),DFS,0.012619991321116686,0.008300004992634058,0.026499968953430653,0.0,0.0,False
большой (100x100),A,0.013079994823783636,0.008699949830770493,0.027500034775584936,0.0,0.0,False
пустой (50x50),BFS,29.2012800113298,19.71900003263727,47.252200020011514,99.0,99.0,True
пустой (50x50),DFS,13.176999986171722,12.441499973647296,13.887099979911,1275.0,1275.0,True
пустой (50x50),A,50.366899999789894,47.1535999677144,60.296199982985854,99.0,99.0,True
без выхода (20x20),BFS,0.004239997360855341,0.002700020559132099,0.00909995287656784,0.0,0.0,False
без выхода (20x20),DFS,0.006399990525096655,0.003200024366378784,0.012699980288743973,0.0,0.0,False
без выхода (20x20),A,0.008680007886141539,0.005399982910603285,0.01810002140700817,0.0,0.0,False
1 лабиринт стратегия время_ср время_мин время_макс посещено_ср длина_пути_ср путь_найден
2 маленький (10x10) BFS 0.9148200158961117 0.8840999798849225 0.9673000313341618 19.0 19.0 True
3 маленький (10x10) DFS 0.717819994315505 0.5779999773949385 0.8650000090710819 39.0 39.0 True
4 маленький (10x10) A 1.577159995213151 1.531599962618202 1.7019000370055437 19.0 19.0 True
5 средний (50x50) BFS 14.496059995144606 12.946999981068075 18.392199999652803 99.0 99.0 True
6 средний (50x50) DFS 8.470179990399629 7.544599997345358 9.55930002965033 393.0 393.0 True
7 средний (50x50) A 9.11291999509558 8.53859999915585 9.788900031708181 99.0 99.0 True
8 большой (100x100) BFS 0.013179995585232973 0.009100011084228754 0.026200024876743555 0.0 0.0 False
9 большой (100x100) DFS 0.012619991321116686 0.008300004992634058 0.026499968953430653 0.0 0.0 False
10 большой (100x100) A 0.013079994823783636 0.008699949830770493 0.027500034775584936 0.0 0.0 False
11 пустой (50x50) BFS 29.2012800113298 19.71900003263727 47.252200020011514 99.0 99.0 True
12 пустой (50x50) DFS 13.176999986171722 12.441499973647296 13.887099979911 1275.0 1275.0 True
13 пустой (50x50) A 50.366899999789894 47.1535999677144 60.296199982985854 99.0 99.0 True
14 без выхода (20x20) BFS 0.004239997360855341 0.002700020559132099 0.00909995287656784 0.0 0.0 False
15 без выхода (20x20) DFS 0.006399990525096655 0.003200024366378784 0.012699980288743973 0.0 0.0 False
16 без выхода (20x20) A 0.008680007886141539 0.005399982910603285 0.01810002140700817 0.0 0.0 False

BIN
BrychkinKA/427.md Normal file

Binary file not shown.

View File

@ -0,0 +1,47 @@
classDiagram
class Maze {
+width
+height
+cells
+start
+exit
+get_neighbors()
}
class Cell {
+x
+y
+is_wall
+is_start
+is_exit
}
class MazeBuilder {
<<interface>>
+build_from_file()
}
class TextFileMazeBuilder {
+build_from_file()
}
class PathFindingStrategy {
<<interface>>
+find_path()
}
class BFSStrategy
class DFSStrategy
class AStarStrategy
class MazeSolver {
+solve()
}
Maze --> Cell
TextFileMazeBuilder ..|> MazeBuilder
BFSStrategy ..|> PathFindingStrategy
DFSStrategy ..|> PathFindingStrategy
AStarStrategy ..|> PathFindingStrategy
MazeSolver --> PathFindingStrategy
MazeSolver --> Maze

View File

@ -0,0 +1,135 @@
# Отчёт по заданию №2
### Реализация поиска пути в лабиринте с использованием паттернов проектирования
---
## 1. Цель работы
Разработать архитектуру и реализацию системы поиска пути в лабиринте, применив паттерны:
- Builder — построение лабиринта из файла
- Strategy — выбор алгоритма поиска
- Observer — отображение состояния
- Command — управление игроком
Также провести экспериментальное сравнение алгоритмов BFS, DFS и A\*.
---
## 2. Архитектура проекта
Структура каталогов:
```
BrychkinKA/
├── src/
│ ├── builder/
│ ├── model/
│ ├── solver/
│ ├── strategy/
│ └── ui/
├── mazes/
├── experiments/
└── docs/
```
---
## 3. Используемые паттерны
### 3.1 Builder
Абстрагирует процесс построения лабиринта из текстового файла.
### 3.2 Strategy
Позволяет переключать алгоритмы поиска пути без изменения остального кода.
### 3.3 Observer
Используется для отображения состояния лабиринта в консоли.
### 3.4 Command
Реализует управление игроком и пошаговое перемещение.
---
## 4. Диаграмма классов
Диаграмма находится в файле: `class_diagram.mmd`
---
## 5. Эксперименты
Эксперименты проводились на пяти лабиринтах:
- small.txt — простой, проходимый
- medium.txt — средний по сложности
- empty.txt — полностью свободное поле
- no_exit.txt — отсутствует выход
- big.txt — большой лабиринт, путь отсутствует
Алгоритмы:
- BFS
- DFS
- A\*
---
## 6. Результаты
### 6.1 Таблица результатов
| Файл | Алгоритм | Посещено | Длина пути |
| ----------- | -------- | -------- | ---------- |
| big.txt | BFS | 27 | 0 |
| big.txt | DFS | 27 | 0 |
| big.txt | A\* | 27 | 0 |
| empty.txt | BFS | 10 | 10 |
| empty.txt | DFS | 10 | 10 |
| empty.txt | A\* | 10 | 10 |
| medium.txt | BFS | 21 | 17 |
| medium.txt | DFS | 19 | 17 |
| medium.txt | A\* | 21 | 17 |
| no_exit.txt | BFS | 0 | 0 |
| no_exit.txt | DFS | 0 | 0 |
| no_exit.txt | A\* | 0 | 0 |
| small.txt | BFS | 7 | 7 |
| small.txt | DFS | 7 | 7 |
| small.txt | A\* | 7 | 7 |
---
## 7. Графики
Графики находятся в файле:
`experiments/plot_graphs.py`
- время работы алгоритмов
- количество посещённых клеток
---
## 8. Выводы
1. A\* показывает лучшие результаты на средних и больших лабиринтах, но имеет небольшой накладной расход.
2. DFS посещает меньше клеток, но не гарантирует кратчайший путь.
3. BFS всегда находит кратчайший путь, но исследует больше пространства.
4. На лабиринтах без выхода все алгоритмы корректно возвращают `path_len = 0`.
5. Архитектура с паттернами позволяет легко расширять проект и добавлять новые алгоритмы.
---
## 9. Приложения
- Исходный код
- Лабиринты
- CSV с результатами
- Диаграммы

View File

@ -0,0 +1,21 @@
# Диаграммы проекта
## 1. Диаграмма классов
См. файл `class_diagram.mmd`.
## 2. Структура каталогов
```
vinichukan/
├── src/
├── mazes/
├── experiments/
└── docs/
```
## 3. Логика работы алгоритмов
- BFS — поиск в ширину
- DFS — поиск в глубину
- A\* — эвристический поиск с манхэттенской метрикой

View File

@ -0,0 +1,65 @@
import os
import sys
import csv
from time import perf_counter
# Добавляем корневую папку BrychkinKA в sys.path
sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
from src.builder.text_file_maze_builder import TextFileMazeBuilder
from src.strategy.bfs_strategy import BFSStrategy
from src.strategy.dfs_strategy import DFSStrategy
from src.strategy.astar_strategy import AStarStrategy
from src.solver.maze_solver import MazeSolver
def run_experiments():
builder = TextFileMazeBuilder()
strategies = {
"BFS": BFSStrategy(),
"DFS": DFSStrategy(),
"A*": AStarStrategy()
}
# Папка с лабиринтами относительно корня
root_dir = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
maze_dir = os.path.join(root_dir, "mazes")
files = [f for f in os.listdir(maze_dir) if f.endswith(".txt")]
results = []
for maze_file in files:
maze_path = os.path.join(maze_dir, maze_file)
maze = builder.build_from_file(maze_path)
for name, strategy in strategies.items():
solver = MazeSolver(maze, strategy)
t0 = perf_counter()
stats = solver.solve()
t1 = perf_counter()
results.append([
maze_file,
name,
stats.time_ms,
stats.visited,
stats.path_len
])
print(f"{maze_file} | {name} | {stats}")
# Сохраняем results.csv в папку experiments
output_path = os.path.join(os.path.dirname(os.path.abspath(__file__)), "results.csv")
with open(output_path, "w", newline="", encoding="utf-8") as f:
writer = csv.writer(f)
writer.writerow(["maze", "algorithm", "time_ms", "visited", "path_len"])
writer.writerows(results)
print(f"\nРезультаты сохранены в {output_path}")
if __name__ == "__main__":
run_experiments()

View File

@ -0,0 +1,76 @@
import csv
import matplotlib.pyplot as plt
import os
def plot_results():
# Определяем правильный путь к results.csv
script_dir = os.path.dirname(os.path.abspath(__file__))
csv_path = os.path.join(script_dir, "results.csv")
results = []
with open(csv_path, "r", encoding="utf-8") as f:
reader = csv.DictReader(f)
for row in reader:
row['time_ms'] = float(row['time_ms'])
row['visited'] = int(row['visited'])
row['path_len'] = int(row['path_len'])
results.append(row)
mazes = sorted(set(r['maze'] for r in results))
algorithms = sorted(set(r['algorithm'] for r in results))
x_labels = []
for m in mazes:
for a in algorithms:
x_labels.append(f"{m.replace('.txt','')}\n{a}")
# График 1: Время выполнения
plt.figure(figsize=(12, 6))
times = []
for m in mazes:
for a in algorithms:
val = [r['time_ms'] for r in results if r['maze'] == m and r['algorithm'] == a]
times.append(val[0] if val else 0)
plt.bar(x_labels, times)
plt.ylabel("Время (мс)")
plt.title("Сравнение времени выполнения алгоритмов")
plt.xticks(rotation=45, ha='right')
plt.tight_layout()
plt.savefig(os.path.join(script_dir, "plot_time.png"), dpi=150)
plt.close()
print("Сохранён: experiments/plot_time.png")
# График 2: Посещённые клетки
plt.figure(figsize=(12, 6))
visited_list = []
for m in mazes:
for a in algorithms:
val = [r['visited'] for r in results if r['maze'] == m and r['algorithm'] == a]
visited_list.append(val[0] if val else 0)
plt.bar(x_labels, visited_list)
plt.ylabel("Посещено клеток")
plt.title("Сравнение количества посещённых клеток")
plt.xticks(rotation=45, ha='right')
plt.tight_layout()
plt.savefig(os.path.join(script_dir, "plot_visited.png"), dpi=150)
plt.close()
print("Сохранён: experiments/plot_visited.png")
# График 3: Длина пути
plt.figure(figsize=(12, 6))
path_list = []
for m in mazes:
for a in algorithms:
val = [r['path_len'] for r in results if r['maze'] == m and r['algorithm'] == a]
path_list.append(val[0] if val else 0)
plt.bar(x_labels, path_list)
plt.ylabel("Длина пути")
plt.title("Сравнение длины найденного пути")
plt.xticks(rotation=45, ha='right')
plt.tight_layout()
plt.savefig(os.path.join(script_dir, "plot_path.png"), dpi=150)
plt.close()
print("Сохранён: experiments/plot_path.png")
if __name__ == "__main__":
plot_results()

Some files were not shown because too many files have changed in this diff Show More