Bir qo'l qoidasi. Labirintdan chiqish yo'lini qanday topish mumkin Protsedura natijasi

Labirint - bu Ascendancy kengayishiga qo'shilgan yangi zona (2.2-patch), u quyi sinflarga (ko'tarilish sinflariga) kirish, shuningdek, sehrlarga kirish uchun to'ldirilishi kerak.

Har bir qiyinchilik bo'yicha labirintning birinchi o'tishi uchun qiyinchiliklar 2 ball beradi, bu kichik sinflarning maxsus passiv qobiliyatlariga investitsiya qilinishi mumkin.

Labirintga qanday kirish mumkin

Asosiy labirintga kirish uchun siz avval 6 ta kichik labirintdan o'tishingiz kerak, ular quyidagi joylarda joylashgan:

  • 1-harakat: Qamoqxona zindon (Quyi qamoqxona)
  • 2-harakat: Gunohlar palatasi 2-darajali
  • 2-harakat: Kript darajasi 1 (Kript darajasi 1)
  • 3-harakat: Krematoriy
  • 3-harakat: Katakombalar
  • 3-harakat: Hedj labirinti - shahardan bu joyga to'g'ridan-to'g'ri teleport yo'q, unga Imperator bog'lari joylashgan joydan borish mumkin

Asosiy labirintga kirish uchinchi bosqich shahrida joylashgan:

Mini-labirintlar bir marta bajarilishi kerak, shundan so'ng asosiy labirintga kirish abadiy ochiq bo'ladi (hozirgi qiyinchilik uchun).

Boss

Asosiy labirintda siz asosiy xo'jayin - Izaro bilan 3 ta jang o'tkazasiz. U turli xil yordamchilarga ega bo'lgan bir nechta versiyalarga ega.

Birinchi bosqich. Birinchi bosqichda unga haykallar yordam beradi. Ular asta-sekin paydo bo'ladi. Bir variantda siz o'ldirishingiz mumkin, ikkinchisida - faqat vaqtincha o'chirib qo'ying. Haykallarni o'ldiring / o'chiring va shundan keyingina xo'jayinga zarar yetkazing. Aks holda, qolgan har bir faol yordamchi uchun u yakuniy jangda bonuslar oladi.

Ikkinchi bosqich. Endi unga mini-bosslar yordam beradi. Ular ketma-ketlikda ham paydo bo'ladi. Avval ularni o'ldiring va shundan keyingina asosiy xo'jayinni uring.

Uchinchi bosqich. Agar oldingi bosqichlardagi yordamchilarni o'ldirmagan bo'lsangiz, xo'jayin sezilarli darajada bufflanadi. Boss xonasida ham tuzoqlar bo'ladi. Eng yaxshi taktika - bu darajadagi ustunlikka ega bo'lish, tuzoqlardan xavfsiz bir joyda turish va xo'jayinni mag'lub etish.

Shunga qaramay, ba'zi versiyalarda Izaro o'yinchini to'g'ridan-to'g'ri tuzoqqa teleport qilishini unutmang.

Uchinchi bosqichdan so'ng siz o'zingizni quyidagi joyda topasiz:

  • Sehr qo'yishi mumkin (har bir o'yinda bir marta)
  • Kichik sinf/qo'shimcha 2 ball oling (agar birinchi marta o'tayotgan bo'lsangiz)
  • Ochiq sandiqlar. Ularni ochish uchun kalitlar talab qilinadi, ularni faqat labirintning o'zida topish mumkin.

Shuningdek, labirintning o'zida "hayvon" joylashgan maxsus zona mavjud. Uni o'ldirish boshliqni osonlashtiradi. Lekin, mening fikrimcha, tuzoqlardan o'tish "bir oz" rivojlangan xo'jayindan ko'ra xavfliroqdir, bu nasos bilan bog'liq muammo emas.

Eslatma: qo'shadigan narsangiz bo'lsa - izohlarda yozing. Foydali maslahatlar ushbu qo'llanmaga qo'shiladi.

Shoshmang

Ehtimol, tuzoqlardan o'tishda asosiy maslahat shoshmaslikdir. Qopqonlarning printsipi va ularni qanday o'tkazish kerakligini tushunish qiyin emas, buning uchun siz bir necha soniya to'xtab, ularni tomosha qilishingiz kerak.

"Shoshmang" maslahati, ayniqsa, barcha liga o'yinchilari uchun juda muhimdir.

Labirint navigatsiyasi

Labirintning har bir joyiga kiraverishda uning yonida maxsus stend bo'ladi, uni bosish orqali labirint xaritasi va hozirgi joylashuvingiz ochiladi.

Yuqori daraja

Labirintning o'tishdagi yuqori darajasi faqat xo'jayin bilan kurashda yordam beradi. Mening tajribalarimga ko'ra, tuzoqlar sog'liqning foizi sifatida zarar etkazadi, shuningdek, zirhlarga e'tibor bermaydi. Shuning uchun, na katta miqdordagi sog'liq, na qurol-aslaha, ko'zingizni yumib, tuzoqlardan o'tishga yordam bermaydi.

Harakat qobiliyatlari

Ba'zi tuzoqlardan sakrab o'tish mumkin, ba'zi qiyin joylarni harakat qobiliyatlari yordamida soniyalarda "uchib ketish" mumkin. Sizning arsenalingizda kamida bittasi borligiga ishonch hosil qiling.

flakonlar

Ba'zi ayniqsa xavfli tuzoqlar, shikastlanishdan tashqari, xarakterga qon ketishini keltirib chiqaradi, shuning uchun ko'pchilikda va barcha idishlarda qon ketishini olib tashlash ayniqsa muhimdir. Bundan tashqari, ko'pchilik sog'likni tiklash flakonlarida tezda tiklanish xususiyatiga ega bo'lish juda muhimdir.

Shaharga qaytish tufayli siz birinchi navbatda labirint orqali o'tishingiz kerak bo'ladi, shuning uchun salomatlikni tiklash uchun ko'proq flakonlarni olish yaxshiroqdir.

Tuzoqning zararini kamaytirish

Tuzoqlarning zararini kamaytirishi mumkin bo'lgan yagona narsa (men bilib olganimdan) - bu chidamlilik to'lovlari.

HAYVONLAR

Agar zarurat bo'lmasa, labirintdagi yirtqich hayvonlarni o'ldirmang - ular kerak bo'lganda kolbalardagi zaryadlarni tiklashga yordam beradi.

Shuningdek, yirtqich hayvonlar sizga chidamlilik to'lovlarini olish imkonini beradi.

Salomatlikni tiklash

Yuqorida aytib o'tilganidek, salomatlik miqdori sizning tuzoqlardan omon qolish qobiliyatini oshirmaydi, lekin uni oshiradigan narsa salomatlikni tiklashdir. Agar labirintdan o'tishdan oldin regeneratsiya uchun qo'shimcha passiv ko'nikmalarni olish mumkin bo'lsa, uni oling.

Shuningdek, salomatlikni tiklashni sezilarli darajada oshiradi:

  • Tosh Golemni chaqiring
  • Noyob kamar

To'g'ridan-to'g'ri maqsadga

Labirintning turli shoxlari bor. Ulardan o'tib, men ularni o'tkazishning o'ziga xos afzalligi nima ekanligini tushunmadim (qo'shimcha kalit, tuzoqlarda xarakterni yo'qotish ehtimoli bilan solishtirganda, umuman yoqmaydi).

foydali narsalar

Labirintdan o'tishda yordam beradigan narsalar mavjud. Men hozirgacha ikkita foydali narsani aniqladim:

  • Noyob tumor Bloodgrip - 100% ko'paytirilgan sog'liq flakonlarini beradi va harakat paytida qon ketish sizga qo'shimcha zarar keltirmaydi.
  • Noyob o'lmas go'sht kamari - soniyada 66,6 - 75 sog'liqni tiklash imkonini beradi.

Agar siz boshqa foydali narsalarni bilsangiz - izohlarda yozing.

Keyingi kun urinib ko'ring

Har bir yangi kunda labirint yangi shaklda yaratiladi va Izaro versiyasi ham o'zgaradi. Agar siz labirintdan o'ta olmasangiz yoki xo'jayinni mag'lub eta olmasangiz, ertasi kuni buni qilishga harakat qiling.

Har bir izni belgilash uchun foydalanishingiz mumkin bo'lgan narsani toping. Tanlangan qurilma labirint tagida belgilar qo'yish uchun mos bo'lishi muhimdir. Misol uchun, yog'och yoki beton kabi qattiq sirtda bo'r ishlatilishi mumkin. Boshqa yuzalar uchun non bo'laklari yoki toshlar kabi ortda qoldirishingiz mumkin bo'lgan narsalarni ko'rib chiqing.

  • Qaysi elementdan foydalansangiz, ikki xil turdagi belgilarni yaratishingiz kerak. Siz yo'llarni farqlashingiz kerak: qaysi birini bir marta bosib o'tgansiz va qaysi birini ikki marta bosib o'tgansiz.

Tasodifiy yo'lni tanlang va keyingi chorrahaga o'ting. Har bir labirint boshida o'z tartibiga ega. Ba'zilar chorrahadan boshlanishi mumkin, boshqalari esa faqat bitta izga ega bo'ladi. Qanday bo'lmasin, istalgan yo'lni tanlang va chorrahaga yoki boshi berk ko'chaga yetguncha oldinga boring.

Borganingizda yo'llarni belgilang. Lukas-Tremaux algoritmi ishlashi uchun qaysi yo'llarni bosib o'tganingizni kuzatib borish juda muhimdir. Siz tanlagan yo'l bilan har bir yo'lning boshi va oxirini belgilashni unutmang.

  • Agar siz birinchi marta yo'lda yurayotgan bo'lsangiz, unda bitta belgi qo'yishingiz kerak. Agar siz bo'rdan foydalansangiz, bitta oddiy chiziq chizing. Agar siz bir hovuch tosh kabi narsalardan foydalansangiz, yo'lning boshida va oxirida tosh qoldiring.
  • Agar siz ikkinchi marta yo'l bo'ylab yursangiz, uni yana belgilang. Bo'rdan foydalanganda ikkinchi chiziqni torting va ob'ektlar bo'lsa, ikkinchisini orqada qoldiring.
  • Agar siz boshi berk ko'chaga tushib qolsangiz, uni boshi berk yo'l deb bilishingiz uchun yo'lni belgilang. Misol uchun, agar siz bo'rdan foydalansangiz, yo'lni "T" bilan belgilang. Ushbu belgini iz olib boradigan chorrahaning yoniga qo'ying.
  • Chorrahalarda belgilanmagan yo'llarga ustunlik bering. Har safar chorrahaga kelganingizda, har bir izdagi belgilarga bir oz vaqt ajrating. Ulardan ba'zilari belgilanmagan bo'lishi mumkin, boshqalari ularni bir marta (yoki ikki marta) tanlaganingizni ko'rsatadi. Belgilarsiz yo'llarga ustunlik berishga arziydi. Shu tarzda siz oldinga siljish ehtimoli ko'proq. Agar barcha yo'llar bir marta belgilangan bo'lsa, tasodifiy birini tanlang.

    Ikki marta belgilangan yo'llardan saqlaning. Agar siz allaqachon bir marta belgilab qo'ygan yo'lni bosib o'tishga majbur bo'lsangiz, uni ikkinchi marta belgilashingiz kerak. Luc-Tremaux algoritmiga ko'ra, ikki marta belgilangan iz sizni chiqishga olib kelmaydi. Agar siz bir xil yo'l ikki marta belgilangan chorrahani topsangiz, har doim boshqa yo'ldan boring, hatto bu orqaga qaytishingiz kerak bo'lsa ham.

    Agar boshi berk ko'chaga kirsangiz, orqaga qayting. Agar siz boshi berk ko'chaga kirsangiz, siz kesib o'tgan oxirgi chorrahaga qaytishingiz kerak. Yo'lni belgilashni unutmang, shunda u boshi berk ko'chaga olib keladi. Chorrahaga etib borganingizdan so'ng, qolgan yo'llardan birini tanlang va labirint bo'ylab davom eting.

    Xayrli kun, aziz jamoa.

    fon

    Yaxshi kunlarning birida Internetda sayr qilib yurganimda labirint topildi. Uning o'tish joyini bilish qiziq bo'ldi va tarmoq bo'ylab yurganimdan keyin men hali ham ishlaydigan dasturiy ta'minotni, labirintga yechim topmadim.

    Mana u:

    Ish kuni zerikarli, kayfiyat zo'r edi. Maqsad, vosita va iroda bor. Xulosa aniq, biz o'tamiz.

    Hikoya

    Qulay yechim uchun labirintning mavjud tasvirini ikki o'lchovli massiv turiga keltirish kerak. Har bir element 3 ta qiymatdan birini qabul qilishi mumkin:

    Const WALL=-1; BLANK=-2; TO'LIQ = -3;

    Birinchidan, men labirint tasvirini skanerlash funksiyalarini, so‘ngra massivga ma’lumotlarni yozishni va massiv ma’lumotlari asosida yangi tasvirni yaratish funksiyasini ko‘rsatmoqchiman:

    Rasmni skanerlash:

    varN:integer=600; LABIRINT:butun sonlar massivi; ... varbit:TBitmap; i,j:integer; start bit:=TBitmap.Create; Agar OpenDialog1.Execute bo'lsa, u holda bitni boshlang.LoadFromFile(OpenDialog1.FileName); i uchun:=0 uchun N qilish j:=0 uchun N qilish agar bit.Canvas.Pixels=clWhite keyin LABIRINT:=BLANK boshqa LABIRINT:=WALL; bit.Free; ... oxiri; oxiri; ...

    Tasvir yaratish:

    varN:integer=600; LABIRINT:butun sonlar massivi; ... genBitmap protsedurasi; varbit:TBitmap; i, j: butun son; start bit:=TBitmap.Create; bit.Width:=N+1; bit.Balandligi:=N+1; i uchun:=0 dan N uchun bajaring j:=0 dan N gacha, agar LABIRINT=BLANK bo‘lsa, keyin bit.Canvas.Pixels:=clWhite // boshqacha bo‘lsa, LABIRINT=WALL bo‘lsa, bit.Canvas.Pixels:=clBlack yana bit.Canvas .Pixels:=clRed; oxiri; bit.SaveToFile("tmp.bmp"); bit.Free; oxiri; ...

    Birinchidan, oq yoki qora 2 rangga ega bo'lish uchun tasvirni monoxrom bmp sifatida qayta saqlashingiz kerak. Agar siz labirintga diqqat bilan qarasangiz, uning qalinligi 2 pikselli devor va 4 pikselli yo‘l bor. Devor va yo'lning qalinligini 1 piksel qilish ideal bo'ladi. Buni amalga oshirish uchun siz tasvirni qayta tiklashingiz, tasvirni 3 ga bo'lishingiz kerak, ya'ni rasmdan piksellarning har 2 va 3, qatori va ustunlarini olib tashlashingiz kerak (bu labirintning to'g'riligi va o'tishiga ta'sir qilmaydi).

    Tayyorlangan rasm:

    Rasm kengligi va balandligi: 1802 piksel.

    1. Tasvirni skanerlash funksiyasidan foydalaning.
    2. Tasvirni qayta tiklang:

    varN:integer=1801; LABIRINT:butun sonlar massivi; ... rebuildArr2 protsedurasi; var i,j:integer; start for i:=0 to ((N div 3)) do for j:=0 to ((N div 3)) do LABIRINT:=LABIRINT; N:=N div 3; oxiri; ...

    3. Biz qayta tiklangan tasvirni yaratamiz.

    Jarayonning natijasi:

    Rasm kengligi va balandligi: 601 piksel.

    Shunday qilib, bizda kerakli turdagi labirintning tasviri bor, endi eng qiziq narsa - labirintdan o'tishning barcha variantlarini qidirish. Bizda nima bor? WALL - devor va BLANK - yo'l yozma qiymatlari bo'lgan massiv.

    To'lqin algoritmidan foydalanib, labirintning o'tish joyini topishga bitta muvaffaqiyatsiz urinish bo'ldi. Nega muvaffaqiyatsiz, barcha urinishlarda bu algoritm “Stack Overflow” xatosiga olib keldi. Men 100% ishonchim komilki, undan foydalanib, siz yo'l-yo'riqni topishingiz mumkin, ammo qiziqarliroq narsani o'ylab topish uchun sug'urta bor edi.

    Bu g'oya darhol paydo bo'lmadi, parchaning bir nechta amalga oshirilishi bor edi, ular vaqt o'tishi bilan 3 daqiqa davomida ishladilar, shundan so'ng tushuncha paydo bo'ldi: "Agar biz o'tish yo'llarini emas, balki to'g'ridan-to'g'ri yo'lni izlasak nima bo'ladi? labirintdan o'tish va ularni boshi berk ko'cha sifatida belgilang."

    Algoritm bu:
    Labirintning barcha yoʻl nuqtalarida rekursiv funksiyani bajaring:
    1. Agar biz yo'lda tursak va atrofimizda 3 ta devor bo'lsa, biz turgan joyni boshi berk ko'cha sifatida belgilaymiz, aks holda biz funktsiyadan chiqamiz;
    2. Biz 1-banddan devor bo'lmagan joyga o'tamiz va 1-bandni takrorlaymiz;

    Dasturiy ta'minotni amalga oshirish:

    varN:integer=600; LABIRINT:butun sonlar massivi; ... protsedura setBlankAsDeadblockRec(x,y:integer); vark:integer; startk:=0; agar LABIRINT=bo'sh bo'lsa, agar LABIRINT bo'lsa, boshlang<><><><>BLANK keyin k:=k+1; agar k=4 bo'lsa, LABIRINT:=DEADBLOCK; agar k=3 bo'lsa, LABIRINT ni boshlang:=DEADBLOCK; agar LABIRINT=BLANK keyin setBlankAsDeadblockRec(x-1,y); agar LABIRINT=BLANK keyin setBlankAsDeadblockRec(x,y-1); agar LABIRINT=BLANK keyin setBlankAsDeadblockRec(x+1,y); agar LABIRINT=BLANK keyin setBlankAsDeadblockRec(x,y+1); oxiri; oxiri; oxiri; protseduralar to'plamiDeadblock; var i,j:integer; start for i:=1 to N-1 do for j:=1 to N-1 do setBlankAsDeadblockRec(i,j); oxiri; ...

    Xulosa

    Men "to'liq" ish algoritmini oldim, uni labirint orqali to'liq topish uchun foydalanish mumkin. Ikkinchisi tezlik bo'yicha barcha kutilganidan oshib ketdi. Umid qilamanki, mening kichik ishim kimgadir foyda keltiradi yoki yangi fikrlarga undaydi.

    Dastur kodi va o'tgan labirint:

    //Iltimos, men ishlatgan dasturlash tili uchun meni tepmang. birlik 1; interfeysi Windows, Grafika, Formalar, Dialoglar, ExtCtrls, StdCtrls, Controls, Classesdan foydalanadi; const WALL=-1; BLANK=-2; TO'LIQ = -3; TForm1 turi = sinf(TForm) tugmasi1: TBtugmasi; OpenDialog1: TOpenDialog; protsedura Button1Click(Sender: TObject); xususiy ( Private declarations ) public ( Public deklaratsiyalar ) end; var Form1: TForm1; N:integer=600; LABIRINT:butun sonlar massivi; amalga oshirish ($R *.dfm) genBitmap protsedurasi; varbit:TBitmap; i, j: butun son; start bit:=TBitmap.Create; bit.Width:=N+1; bit.Balandligi:=N+1; i uchun:=0 dan N uchun bajaring j:=0 dan N gacha, agar LABIRINT=BLANK bo‘lsa, keyin bit.Canvas.Pixels:=clWhite // boshqacha bo‘lsa, LABIRINT=WALL bo‘lsa, bit.Canvas.Pixels:=clBlack yana bit.Canvas .Pixels:=clRed; oxiri; bit.SaveToFile("tmp.bmp"); bit.Free; oxiri; rebuildArr2 protsedurasi; var i,j:integer; start for i:=0 to ((N div 3)) do for j:=0 to ((N div 3)) do LABIRINT:=LABIRINT; N:=N div 3; oxiri; protsedura setBlankAsDeadblockRec(x,y:integer); vark:integer; startk:=0; agar LABIRINT=bo'sh bo'lsa, agar LABIRINT bo'lsa, boshlang<>BLANK keyin k:=k+1; agar LABIRINT<>BLANK keyin k:=k+1; agar LABIRINT<>BLANK keyin k:=k+1; agar LABIRINT<>BLANK keyin k:=k+1; agar k=4 bo'lsa, LABIRINT:=DEADBLOCK; agar k=3 bo'lsa, LABIRINT ni boshlang:=DEADBLOCK; agar LABIRINT=BLANK keyin setBlankAsDeadblockRec(x-1,y); agar LABIRINT=BLANK keyin setBlankAsDeadblockRec(x,y-1); agar LABIRINT=BLANK keyin setBlankAsDeadblockRec(x+1,y); agar LABIRINT=BLANK keyin setBlankAsDeadblockRec(x,y+1); oxiri; oxiri; oxiri; protseduralar to'plamiDeadblock; var i,j:integer; start for i:=1 to N-1 do for j:=1 to N-1 do setBlankAsDeadblockRec(i,j); oxiri; protsedurasi TForm1.Button1Click(Sender: TObject); varbit:TBitmap; i,j:integer; start bit:=TBitmap.Create; Agar OpenDialog1.Execute bo'lsa, u holda bitni boshlang.LoadFromFile(OpenDialog1.FileName); i uchun:=0 uchun N qilish j:=0 uchun N qilish agar bit.Canvas.Pixels=clWhite keyin LABIRINT:=BLANK boshqa LABIRINT:=WALL; bit.Free; setDeadblock; genBitmap; oxiri; oxiri; oxiri.

    Eng qisqa yoʻlni topish uchun labirintning topilgan yoʻlaklariga toʻlqin algoritmini qoʻllash rejalashtirilgan. Boshqa qanday algoritmlarni qo'llash mumkinligini eshitish qiziq tez katta labirintda yo'l topyapsizmi?

    Labirintdan o'tishning eng oddiy qoidalaridan biri bu "bir qo'l" qoidasi: labirint bo'ylab harakatlanayotganda, siz doimo o'ng yoki chap qo'lingiz bilan uning devoriga tegishingiz kerak. Bu algoritm, ehtimol, qadimgi yunonlar uchun ma'lum bo'lgan. Siz uzoq yo'lni bosib, barcha boshi berk ko'chalarga borishingiz kerak bo'ladi, lekin oxir-oqibat maqsadga erishiladi. Garchi bu qoida bitta kamchilikka ega bo'lsa-da, bu haqda keyinroq gaplashamiz.

    Keling, "o'ng qo'l" qoidasiga muvofiq harakat qiladigan robotni tasvirlashga harakat qilaylik.

    Ishning boshida robot ergashadigan devorni topishi kerak. Buning uchun u to'siqqa urilguncha oldinga siljishi mumkin.

    Robot to‘siqqa urilganidan keyin “o‘ng qo‘l” qoidasiga muvofiq harakatlana boshlaydi.

    Devor bo'ylab harakatlanayotgan robot o'ng tomonda o'tish joyi bor yoki yo'qligini tekshiradi. Agar o'tish joyi bo'lsa, robot o'ngdagi devordan ajralib ketmaslik uchun unga ergashishi kerak.

    Agar o'tish joyi bo'lmasa - oldinda devor bor - robot chapga buriladi. Agar yana o'tish joyi bo'lmasa, u yana chapga buriladi, shu bilan 180 gradusga buriladi va teskari yo'nalishda ketadi.

    "O'ng qo'l" qoidasi bo'yicha ishlaydigan robot uchun algoritmning blok diagrammasi rasmda ko'rsatilgan.

    Keling, ushbu algoritmning ishlashini tekshirishga harakat qilaylik va unga dastur yozamiz. Shu maqsadda dasturlash muhitiga murojaat qilaylik. Ushbu muhit robotlarni boshqarish bilan bog'liq turli xil algoritmlarni modellashtirish uchun qulay vositadir. Unda toshbaqa ijrochisi bor, uning mohiyati haqiqiy robotdan boshqa narsa emas. Toshbaqa juda qulay buyruqlar to'plamiga ega - oldinga, o'ngga, chapga, orqaga. Bundan tashqari, toshbaqaning markazida u joylashgan sirtning ohangiga qarab 0 dan 100 gacha qiymat qabul qiluvchi sensor mavjud.

    Biz foydalanadigan logotip tili dialekti juda sodda va Basic tiliga o'xshaydi. Tilning buyruqlari bilan tanishishingiz mumkin. GameLogo dasturlash muhitini bepul yuklab olish - . Tarqatish hajmi kichik - atigi 1 Mb.

    GameLogo arxivida labirintlar bilan fon rasmlari mavjud, ulardan birini biz ishlatamiz.

    Dasturning eng boshida biz toshbaqaga patni ko'tarish buyrug'ini beramiz (sukut bo'yicha, toshbaqa o'z orqasida iz qoldiradi).

    Maydon o'lchami 800 x 600 nuqta. Toshbaqa uchun boshlang'ich pozitsiyasi 115, 545 (oq kvadrat) koordinatalarida.

    Labirint yo'llarining rangi ochiq, ularda sensor 50 dan katta qiymatlarni oladi. Labirint devorlarining rangi qorong'i, sensor qiymati 50 dan kam bo'ladi. Labirintdan chiqish quyidagicha ifodalanadi. qora kvadrat, yuqoridagi sensor qiymati 0 ga teng bo'ladi.

    Keling, bayroq o'zgaruvchisini e'lon qilaylik, uning yordamida biz labirintdan chiqishga erishilganligini nazorat qilamiz.

    Keling, dastur yozamiz va uni "Ishga tushirish" deb nomlangan katta qizil tugma yordamida ishga tushiramiz.

    O'zgaruvchan fon bayrog'i = maze1.gif qalam joyini ko'taring 115, 545 "Birinchi devorni qidiring o'lchov > 50 (oldinga 12) bo'lguncha takrorlang "o'ng qo'l qoidasi bayroq = 0 bo'lguncha takrorlang (o'ngga 90 oldinga 12 agar sensor = 0 bo'lsa, bayroq = 1 aks holda sensori bo'lsa

    Agar labirintning alohida devorlari yo'qligi ma'lum bo'lsa, ya'ni siz boshlang'ich nuqtaga qaytishingiz mumkin bo'lgan yopiq marshrutlar bo'lmasa, unda bunday labirint oddiy bog'langan deb ataladi va uni har doim "" tugmachasini qo'llash orqali butunlay chetlab o'tish mumkin. bir qo'l" qoidasi.

    Agar labirintda mustaqil devorlar mavjud bo'lsa, unda "bir qo'l" qoidasidan foydalanib, barcha koridorlar va o'liklardan o'tish har doim ham mumkin emas. Alohida devorlari va yopiq yo'llari bo'lgan labirintlar ko'paytmali bog'langan deb ataladi. Shu bilan birga, ko'paytiriladigan bog'langan labirintlarni ikki guruhga bo'lish mumkin: maqsad atrofida "halqa" bo'lmagan (yopiq marshrut maqsad atrofida o'tmaydi) va maqsad atrofida yopiq "halqa" bilan (maqsadni chetlab o'tish mumkin). yopiq marshrut bo'ylab).

    Ikkinchi guruhning ko'p bog'langan labirintlarida "bir qo'l" qoidasi ishlamaydi va undan foydalanib, maqsadga erishish mumkin emas. Ammo bu labirintlarni ham aniq algoritmga tayanib o'tkazish mumkin.

    Bunday labirintlar muammosini hal qilish nisbatan kechroq vaqtga to'g'ri keladi va u Leonhard Eyler tomonidan boshlangan. Eyler, bejiz emas, har qanday labirintdan chiqish yo'lini va bundan tashqari, nisbatan sodda tarzda topish mumkinligiga ishondi.

    Har qanday labirintlardan o'tishning universal algoritmi faqat bir asrdan keyin frantsuz matematigi E.Lyukning 1882 yilda nashr etilgan "Recreations matematiques" kitobida tasvirlangan. Qizig'i shundaki, algoritmni tavsiflashda Luka boshqa frantsuz matematigi M. Tremauxning ustuvorligiga ishora qildi. Shunday qilib, algoritm sifatida ma'lum bo'ldi Lukas-Tremo algoritmi.

    Tremo quyidagi qoidalarni taklif qiladi: labirintning istalgan nuqtasini qoldirib, siz uning devoriga (xoch) belgi qo'yishingiz va o'zboshimchalik bilan o'lik yoki chorrahaga o'tishingiz kerak; birinchi holda, orqaga qayting, ikkinchi xochni qo'ying, bu yo'l ikki marta - oldinga va orqaga sayohat qilinganligini ko'rsatib, hech qachon sayohat qilinmagan yoki bir marta sayohat qilgan yo'nalishga boring; ikkinchisida - kirish va chiqishdagi har bir chorrahani bitta xoch bilan belgilab, o'zboshimchalik bilan yo'nalishga o'ting; agar chorrahada allaqachon bitta xoch bo'lsa, unda siz yangi yo'lga borishingiz kerak, agar bo'lmasa, yo'l ikkinchi xoch bilan belgilab, sayohat qilgan.

    Tremo algoritmini bilib, siz afsonaviy Theseusning xatti-harakatlarini to'g'rilashingiz mumkin. Sevimli Ariadnaning sovg'asidan ilhomlanib, u labirint bo'ylab ishonch bilan yuradi. To'satdan uning oldida o'tish joyi paydo bo'ladi, uning bo'ylab ip allaqachon cho'zilgan ... Nima qilish kerak? Hech qanday holatda uni kesib o'tmang, balki allaqachon ma'lum bo'lgan yo'l bo'ylab qaytib, ipni ikki barobar oshirib, boshqa o'tmagan harakat paydo bo'lguncha.

    Tremo algoritmining bir variantidan foydalanib, axborot nazariyasining otasi Klod Elvud Shennon birinchi o'zini o'zi o'rganadigan robotlardan birini yaratdi. Shennon unga "Tesey" nomini berdi, ammo tarixda "Theseus" Shennonning "sichqonchasi" sifatida tanildi. “Sichqoncha” avval butun labirintni ko‘zdan kechirdi, so‘ngra (ikkinchi marta) ikki marta o‘tgan bo‘limlardan qochib, ancha tezroq ketdi.


    Bugungi kunda labirintdan o'tayotgan robotlar dunyoning bir qancha mamlakatlarida bo'lib o'tadigan fikrlash mashinalari bo'yicha eng qiziqarli tanlovlardan birining ishtirokchilaridir. Bu musobaqalar umumiy nomga ega bo‘lib, texnik yangiliklari bilan robototexnika sporti bo‘yicha yetakchilar qatoriga kiradi.

    Birinchi Rossiya Robot Olimpiadasida musobaqalar o'tkazildi, ularning maqsadi labirintning bir turidan o'tish edi: eng qisqa vaqt ichida devorlardagi "ochiq eshiklar" orqali o'tib, robot boshidan oxirigacha borishi kerak edi. tugatish. Robot labirint poliga chizilgan qora chiziqlar bo‘ylab harakatini boshqara olardi.

    Bu surat hozir butun internetda tarqalmoqda. Bu ko'pincha quyidagi matn bilan birga keladi: Isroil harbiy razvedkasida autizm spektrining turli kasalliklaridan aziyat chekayotgan o‘g‘il-qizlar xizmat qiladigan maxsus bo‘linmaga ega. Otistik odamlar asosan kompyuter ekranlarida paydo bo'ladigan xaritalar va aerofotosuratlarni tahlil qiladilar. Fikrlashning o'ziga xos xususiyatlaridan kelib chiqqan holda, ular eng kichik tafsilotlarga e'tibor berishadi, ularni erdagi harbiy harakatlarga tayyorgarlik ko'rishda xodimlarning mumkin bo'lgan yo'qotishlarini oldini olish mumkin. Shunday qilib, autizmli skautlar askarlarning hayotini saqlab qolishadi."

    Ushbu labirintni sinab ko'rdingizmi?

    Keling, bu masala haqida ko'proq bilib olaylik.

    Hatto ushbu labirint haqida gapirganda ham, " Autizmli odam vizual va matnli ma'lumotlarni autizm spektrining buzilishidan aziyat chekadigan odamga qaraganda bir necha barobar tezroq qayta ishlashga qodir. Ularning bu xususiyati yuqori texnologiyalarda ajralmas bo'lib chiqdi. Daniyaning "Specialisterne" texnologiya konsalting firmasida uning xodimlarining 75 foizi autizmli va Asperger sindromi, shuningdek, autizm spektriga ega. Ular oddiy ishchilardan tafsilotlarga ajoyib e'tibor, g'ayritabiiy konsentratsiya va katta hajmdagi ma'lumotlarni tezda qayta ishlash qobiliyati bilan ajralib turadi. Bu ko'nikmalar, ayniqsa, dasturiy ta'minotni sinovdan o'tkazuvchilar uchun foydalidir. Ushbu ish bilan shug'ullanadigan autizmli odamlarning ish sifati oddiy odamlarning ish sifatiga qaraganda bir necha baravar yuqori. Autizmli odamlar 4000 sahifa texnik hujjatlarni oddiy odamlarga qaraganda 10 baravar tezroq tekshira oladilar va hech qachon bitta xatoni o'tkazib yubormaydilar."

    Ammo keling, autizmli odamlarni bir chetga surib qo'ying va oxirida bu labirintdan qanday o'tish mumkinligini bilib olaylik! Shunday...

    Vazifani hal qilib bo'lmaydi! Bizda toq sonli eshikli 3 ta xona mavjud ("qalamni ko'tarmasdan" chizmalar bilan o'xshashlik). Muammoni hal qilish uchun toq sonli chiziqlar (bizning holimizda, o'tish joylari) bo'lgan 2 dan ortiq nuqta (bizning holatlarimizda, xonalar) bo'lishi kerak.

    Agar biz ushbu labirintning grafigini tuzadigan bo'lsak, bu Eyler yo'li ekanligini ko'ramiz, chunki uning toq sonli qirralari (eshiklari) bo'lgan 3 ta uchi bor va sinov shartlarini bajarish uchun ulardan faqat ikkitasi bo'lishi mumkin.

    Königsbergning etti ko'prigi muammosi yoki Königsberg ko'prigi muammosi(nemis Konigsberger Brukken muammosi) eski matematik masala bo'lib, unda Königsbergning barcha ettita ko'prigidan qanday qilib ikki marta o'tmasdan o'tish mumkinligi so'ralgan. U birinchi marta 1736 yilda nemis va rus matematigi Leonhard Eyler tomonidan yechilgan.

    Uzoq vaqt davomida Königsberg aholisi orasida bunday jumboq keng tarqalgan: barcha ko'priklardan (Pregolya daryosi bo'ylab) ularning hech biridan ikki marta o'tmasdan qanday o'tish kerak. Ko'pgina Königsbergerlar bu muammoni ham nazariy, ham amaliy jihatdan yurish paytida hal qilishga harakat qilishdi. Biroq, hech kim bunday marshrutning mavjudligini isbotlay yoki rad eta olmadi.

    1736 yilda yettita ko'prik muammosi taniqli matematik, Sankt-Peterburg Fanlar akademiyasining a'zosi Leonhard Eylerni qiziqtirdi, bu haqda u 1736 yil 13 martda italiyalik matematik va muhandis Marioniga yozgan maktubida yozgan. Ushbu maktubda Eyler barcha ko'priklardan ikki marta o'tmasdan ham barcha ko'priklardan o'tish mumkin yoki yo'qligini aniqlash oson bo'lgan qoidani topa olganini yozadi. Javob "yo'q" edi.

    Soddalashtirilgan diagrammada shahar qismlari (grafik) chiziqlari bo'lgan ko'priklarga (grafik yoylari), shaharning qismlari esa chiziqlarning ulanish nuqtalariga (grafikning cho'qqilari) mos keladi. Fikrlash jarayonida Eyler quyidagi xulosalarga keldi:


    • Toq cho'qqilar soni (toq sonli qirralar olib keladigan cho'qqilar) juft bo'lishi kerak. Toq sonli toq uchlari bo'lgan grafik bo'lishi mumkin emas.

    • Agar grafikning barcha cho'qqilari juft bo'lsa, u holda siz qalamni qog'ozdan ko'tarmasdan grafik chizishingiz mumkin va siz grafikning istalgan cho'qqisidan boshlanib, uni bir xil cho'qqida tugatishingiz mumkin.

    • Ikkitadan ortiq toq uchlari boʻlgan grafikni bitta zarba bilan chizish mumkin emas.

    Königsberg ko'priklarining grafigida to'rtta (ko'k rangda) toq uchlari (ya'ni hammasi) bor edi, shuning uchun ularning hech biridan ikki marta o'tmasdan barcha ko'priklardan o'tish mumkin emas.

    Eyler tomonidan yaratilgan grafik nazariyasi transport va aloqa tizimlarida juda keng qo'llanilishini topdi (masalan, tizimlarning o'zini o'rganish, tovarlarni etkazib berishning optimal marshrutlarini tuzish yoki Internetda marshrutlash ma'lumotlari uchun).

    1905 yilda Imperator ko'prigi qurildi, keyinchalik u Ikkinchi Jahon urushi paytida bombardimon paytida vayron bo'ldi. Afsonaga ko'ra, bu ko'prik Kayzerning o'zi buyrug'i bilan qurilgan, u Königsberg ko'priklari muammosini hal qila olmagan va dunyoviy qabulda bo'lgan bilimdonlarning u bilan o'ynagan hazil qurboni bo'lgan (agar siz qo'shsangiz). sakkizinchi ko'prik, keyin muammo hal qilinadi). Yubiley ko'prigi 2005 yilda Imperator ko'prigi tayanchlarida qurilgan. Ayni paytda Kaliningradda ettita ko'prik mavjud va Kaliningrad orollari va ko'priklari asosida qurilgan grafik hali ham Eyler yo'liga ega emas.

    Mana xlazex tomonidan taklif qilingan yana bir yechim

    1-rasmga qaraylik: biz har bir alohida qismni kvadratchalar bilan o'rab olamiz, "qo'shimcha" nuqtalarni istisno qilamiz, ya'ni. o'sha nuqtalar, ulardan foydalanish yo'llarning mumkin bo'lgan sonini oshiradi va ularni istisno qilish chiziqdan o'tgan eshiklar soniga va konturning yopiqligiga ta'sir qilmaydi. Yo'lning boshlanishi uchun, masalan, nuqtani oling 2 .
    Keling, 2-rasmga qaraylik: unda men bir xil konturni tasvirladim, lekin boshlang'ich nuqtaning keyingilari bilan aloqalari ko'proq ko'rinadigan tarzda tasvirlangan. Rasmda aniq ko'rinib turibdiki, konturning ko'k bilan belgilangan qismini bir marta yopish mumkin emas, ya'ni. konturning bu qismi yagona bo'lsa ham, yopiq chiziqni qurish mumkin bo'lgan yo'llar bo'lmaydi.
    Xulosa: ikki o'lchovli koordinatalar tizimida muammoning yechimi yo'q.

    Lekin 3D da yechim bor :-)

    Mayli, hazil, hazil...

  • Yuklanmoqda...Yuklanmoqda...