php生成迷宫和迷宫寻址算法实例解决思路
php生成迷宫和迷宫寻址算法实例
较之前的终于有所改善。生成迷宫的算法和寻址算法其实是一样。只是一个用了遍历一个用了递归。参考了网上的Mike Gold的算法。
- PHP code
<!-- Code highlighting produced by Actipro CodeHighlighter (freeware) http://www.CodeHighlighter.com/ --> <?php //zairwolf z@cot8.com header('Content-Type: text/html; charset=utf-8'); error_reporting(E_ALL); //n宫格迷宫 define('M', 39);//宫数 define("S", 20);//迷宫格大小 $_posArr = array(array(0, -1), array(1, 0), array(0, 1), array(-1, 0));//当前点寻址的四个xy方向 上右下左 //生成迷宫 $maze = array(); $mazeUnit = array(1, 1, 1, 1);//上右下左 for($x=0; $x<=M; $x++){ for($y=0; $y<=M; $y++){ $maze[$x][$y] = $mazeUnit; } } $maze2 = array();//破墙后的已访问格子 $mazeOrder = array();//破墙顺序 $x = $y = 0;//初始入口 while(count($maze)>0){ $tmpArr = array(); foreach($_posArr as $val){ $nx = $x + $val[0]; $ny = $y + $val[1]; if(isset($maze[$nx][$ny])){//未破墙过的格子 $tmpArr[] = array($nx, $ny); } } if($tmpArr){//有未破墙的格子,随机出一个,破墙 list($nx, $ny) = $tmpArr[array_rand($tmpArr)]; $maze2[$nx][$ny] = $maze[$nx][$ny]; if(empty($maze2[$x][$y])) $maze2[$x][$y] = $maze[$x][$y]; $pos = array($nx - $x, $ny - $y); foreach($_posArr as $key=>$val){//循环四个方向,找出需要破的墙 if($pos == $val) { $maze2[$x][$y][$key] = 0;//原格子破墙 $maze2[$nx][$ny][($key+2)%4] = 0;//新格子破墙 } } //设置新的当前格后返回继续while循环 $x = $nx; $y = $ny; $mazeOrder[] = array($x, $y); unset($maze[$x][$y]);//去掉已破墙的格子 if(empty($maze[$x])) unset($maze[$x]); }else{//当前xy周围不存在未破墙的格子,返回上一个格子继续破墙 array_pop($mazeOrder); if($mazeOrder) list($x, $y) = $mazeOrder[count($mazeOrder) - 1]; } } //留出出口 $maze = $maze2; $maze[0][0][3] = 0; $maze[M][M][1] = 0; //寻址 $pathArr = findPath($maze, 0, 0, false); printMaze($maze, $pathArr); echo "<img src="maze.png" alt=" php生成迷宫和迷宫寻址算法实例解决思路 " > <a href="javascript:;" onclick="location.reload();">刷新</a>"; //打印迷宫和寻址结果by z@cot8.com function printMaze($maze, $pathArr){ $im = ImageCreate((M + 1) * S + 1, (M + 1) * S + 1); $bg = ImageColorAllocate($im, 236, 233, 216); $pathColor=ImageColorAllocate($im, 255, 0, 0); $exitColor=ImageColorAllocate($im, 134, 255, 0); $borderColor = ImageColorAllocate($im, 0, 0, 0); ImageRectangle($im, 0, 0, (M + 1) * S, (M + 1) * S, $borderColor);//包边 ImageLine($im, 0, 0, 0, S, $bg);//右上边开口 ImageLine($im, (M + 1) * S, M * S, (M + 1) * S, (M + 1) * S, $bg);//左下边开口 foreach($maze as $x=>$xarr){//生成格子 foreach($xarr as $y=>$unit){ if($unit[0]) ImageLine($im, $x * S, $y * S, ($x + 1) * S, $y * S, $borderColor);//上有线 if($unit[1]) ImageLine($im, ($x + 1) * S, $y * S, ($x + 1) * S, ($y + 1) * S, $borderColor);//右有线 if($unit[2]) ImageLine($im, $x * S, ($y + 1) * S, ($x + 1) * S, ($y + 1) * S, $borderColor);//下有线 if($unit[3]) ImageLine($im, $x * S, $y * S, $x * S, ($y + 1) * S, $borderColor);//左有线 //if(in_array(array($x, $y), $pathArr)) ImageFilledEllipse($im, $x * S + S/2, $y * S + S/2, S, S, $pathColor);//寻址格 if(in_array(array($x, $y), $pathArr)) ImageString($im, 1, $x * S + S/5, $y * S + S/5, array_search(array($x, $y), $pathArr), $pathColor);//寻址格 } } ImagePNG($im, 'maze.png'); ImageDestroy($im); } //寻址函数 z@cot8.com function findPath($maze, $x, $y, $fromxy){ global $_posArr; if($x == M && $y == M){//到达出口 Return array(array($x, $y)); } foreach($_posArr as $key=>$val){ if($maze[$x][$y][$key]) continue;//为1则不通 $nx = $x + $val[0]; $ny = $y + $val[1]; if(!isset($maze[$nx][$ny]) || $fromxy == array($nx, $ny)) continue;//边界超出或为来源点 if($pathArr = findPath($maze, $nx, $ny, array($x, $y))) { array_unshift($pathArr, array($x, $y)); Return $pathArr;//能到达出口 } } Return false; }
------解决方案--------------------

Alat AI Hot

Undresser.AI Undress
Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover
Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool
Gambar buka pakaian secara percuma

Clothoff.io
Penyingkiran pakaian AI

AI Hentai Generator
Menjana ai hentai secara percuma.

Artikel Panas

Alat panas

Notepad++7.3.1
Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina
Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1
Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6
Alat pembangunan web visual

SublimeText3 versi Mac
Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Topik panas

Tajuk: Contoh menggunakan fungsi Array.Sort untuk mengisih tatasusunan dalam Teks C#: Dalam C#, tatasusunan ialah struktur data yang biasa digunakan dan operasi pengisihan tatasusunan selalunya diperlukan. C# menyediakan kelas Array, yang mempunyai kaedah Isih untuk menyusun tatasusunan dengan mudah. Artikel ini akan menunjukkan cara menggunakan fungsi Array.Sort dalam C# untuk mengisih tatasusunan dan memberikan contoh kod khusus. Pertama, kita perlu memahami penggunaan asas fungsi Array.Sort. Susunan.Jadi

Apabila pengaturcaraan dalam PHP, kita selalunya perlu menggabungkan tatasusunan. PHP menyediakan fungsi array_merge() untuk melengkapkan penggabungan tatasusunan, tetapi apabila kunci yang sama wujud dalam tatasusunan, fungsi ini akan menimpa nilai asal. Untuk menyelesaikan masalah ini, PHP juga menyediakan fungsi array_merge_recursive() dalam bahasa, yang boleh menggabungkan tatasusunan dan mengekalkan nilai kunci yang sama, menjadikan reka bentuk program lebih fleksibel. array_merge

Dalam PHP, terdapat banyak fungsi tatasusunan berkuasa yang boleh menjadikan operasi tatasusunan lebih mudah dan lebih pantas. Apabila kita perlu menggabungkan dua tatasusunan ke dalam tatasusunan bersekutu, kita boleh menggunakan fungsi array_combine PHP untuk mencapai operasi ini. Fungsi ini sebenarnya digunakan untuk menggabungkan kekunci satu tatasusunan sebagai nilai tatasusunan lain ke dalam tatasusunan bersekutu baharu. Seterusnya, kami akan menerangkan cara menggunakan fungsi array_combine dalam PHP untuk menggabungkan dua tatasusunan menjadi tatasusunan bersekutu. Ketahui tentang array_comb

Dalam pengaturcaraan PHP, tatasusunan ialah struktur data yang sangat penting yang boleh mengendalikan sejumlah besar data dengan mudah. PHP menyediakan banyak fungsi berkaitan tatasusunan, array_fill() adalah salah satu daripadanya. Artikel ini akan memperkenalkan secara terperinci penggunaan fungsi array_fill(), serta beberapa petua dalam aplikasi praktikal. 1. Gambaran keseluruhan fungsi array_fill() Fungsi array_fill() adalah untuk mencipta tatasusunan nilai yang sama dengan panjang yang ditentukan. Secara khusus, sintaks fungsi ini ialah

Modul tatasusunan dalam Python ialah tatasusunan yang dipratentukan, jadi ia mengambil lebih sedikit ruang dalam ingatan daripada senarai standard, dan juga boleh melaksanakan operasi peringkat elemen pantas seperti menambah, memadam, mengindeks dan menghiris. Selain itu, semua elemen dalam tatasusunan adalah daripada jenis yang sama, jadi anda boleh menggunakan fungsi operasi berangka yang cekap yang disediakan oleh tatasusunan, seperti mengira nilai purata, maksimum dan minimum. Selain itu, modul tatasusunan juga menyokong menulis dan membaca objek tatasusunan terus ke dalam fail binari, yang menjadikannya lebih cekap apabila memproses sejumlah besar data berangka. Oleh itu, jika anda perlu memproses sejumlah besar data homogen, anda boleh mempertimbangkan untuk menggunakan modul tatasusunan Python untuk mengoptimumkan kecekapan pelaksanaan kod anda. Untuk menggunakan modul tatasusunan, anda perlu terlebih dahulu

Dalam pengaturcaraan Java, tatasusunan ialah struktur data yang penting. Tatasusunan boleh menyimpan berbilang nilai dalam satu pembolehubah, dan yang lebih penting setiap nilai boleh diakses menggunakan indeks. Tetapi semasa bekerja dengan tatasusunan, beberapa pengecualian mungkin berlaku, salah satunya ialah ArrayStoreException. Artikel ini akan membincangkan punca biasa pengecualian ArrayStoreException. 1. Jenis tidak padan Jenis elemen mesti ditentukan apabila tatasusunan dibuat. Apabila kami cuba menyimpan jenis data yang tidak serasi ke dalam tatasusunan, ia akan membuang

Java adalah bahasa pengaturcaraan yang sangat berkuasa yang digunakan secara meluas dalam pelbagai bidang pembangunan. Walau bagaimanapun, semasa pengaturcaraan Java, pembangun sering menghadapi pengecualian ArrayIndexOutOfBoundsException. Jadi, apakah punca biasa anomali ini? ArrayIndexOutOfBoundsException ialah pengecualian masa jalan biasa di Jawa. Ini bermakna apabila mengakses data, subskrip tatasusunan melebihi julat tatasusunan. Sebab biasa termasuk

Bahasa PHP ialah bahasa pengaturcaraan web yang digunakan secara meluas Tatasusunan adalah struktur data yang sangat biasa digunakan semasa pembangunan aplikasi web. Pasangan nilai kunci dalam tatasusunan membolehkan pengaturcara mengatur dan mengurus data dengan mudah. Fungsi array_flip() PHP ialah fungsi yang sangat berguna Ia boleh menukar kunci dan nilai tatasusunan, menggunakan kunci asal sebagai nilai dan nilai asal sebagai kunci. Artikel ini akan memperkenalkan anda kepada penggunaan fungsi array_flip() PHP dan aplikasinya dalam pengaturcaraan sebenar. array_fl
