栈::迷宫问题

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
 <head>
  <meta http-equiv="Content-Type" content="text/html; charset=gbk" />
  <title>Untitled Document</title>
 </head>
 <body>
  <p>迷宫问题(栈实现)</p>
  <p>以试错及栈的特性,将当前走过的位置存入栈中,得出当前的四个方向是否有可行时,
  存入位置及方向(避免重复走相同的路径)。如此循环。其它部可参考递归中的迷宫算法</p>
   <p>
            <input type="button" id="btnFind" name="btnFind" value="显示路径"/>
        </p>
  <script type="text/javascript">
            /**
             * 栈结构
             */
            function stack(){
                this.item = [];
            }
           
            function push(stack, str){
                var arr = stack.item;
                arr[arr.length] = str;
            }
           
            function pop(stack){
                var arr = stack.item;
                if (arr.length == 0) {
                    return null;
                    // document.writeln("错误,没有数据可以弹出");
                }
                else {
                    var value = arr[arr.length - 1];
                    arr.length = arr.length - 1;
                    return value;
                }
            }
           
            /**
             * 每一步走过的位置
             * @param {Object} _row
             * @param {Object} _column
             * @param {Object} _dir  这上步的下一部在哪个方向(0,1,2,3),会加1以防止重复查找相同的下一步,
             */
            function step(_row, _column, _dir){
                this.row = _row;
                this.column = _column;
                this.dir = _dir;
            }
   /**
    * 创建显示的表格
    * @param {Object} tblId
    */
             function createTable(tblId){
                var html = "<table id='" + tblId + "' border='1'>";
                for (var i = 0; i < 5; i++) {
                    html += "<tr>";
                    for (var j = 0; j < 5; j++) {
                        if (i == 0 && j == 0) {
                            html += "<td>^0^</td>";
                        }
                        else {
                            html += "<td>&nbsp;</td>";
                        }
                    }
                    html += "</tr>";
                }
                html += "</table>";
                document.writeln(html);
            }
   /**
    * 迷宫算法
    * @param {Object} mazing
    * @param {Object} direct
    * @param {Object} row
    * @param {Object} column
    */
    function findpath(mazing, direct,row,column){
      var MaxRow = mazing.length - 2;
                var MaxColumn = mazing[0].length - 2;     
     var stp=new step(row,column,0);
    var stk=new stack();
    mazing[row][column]=2;
    push(stk,stp);   
    while(stk!=null){
     var stp_pre=pop(stk);
     if (!stp_pre) {
      break
     }
     //alert(stp_pre.row+","+stp_pre.column+","+stp_pre.dir+","+direct.length);
     var found_dir=-1;  //是否在哪个方向找到下一个位置
     for(var i=stp_pre.dir,cnt=direct.length;i<cnt ;i++){
      var stp_next=new step(stp_pre.row+direct[i][0],stp_pre.column+direct[i][1],0);
     // alert(stp_next.row+","+stp_next.column+","+mazing[stp_next.row][stp_next.column]);
      if(mazing[stp_next.row][stp_next.column]==0){
       mazing[stp_next.row][stp_next.column]=2;
       if(stp_next.row==MaxRow && stp_next.column==MaxColumn){        
        showpath(mazing,"tbl");
       }else{
        found_dir=i+1;
        var stp=new step(stp_pre.row,stp_pre.column,found_dir);
        push(stk,stp);
        //alert(stp_pre.row+","+stp_pre.column+","+stp_pre.dir);
        push(stk,stp_next);
        break;        
       }
      }
     }
     if (found_dir == -1) {
      mazing[stp_pre.row][stp_pre.column] = 0;
     }
    }
            }
            /**
             * 显示迷宫算法的结果
             * @param {Object} mazing
             * @param {Object} tblId
             */
            function showpath(mazing, tblId){
                var objTable = document.getElementById(tblId)
                var tbody = objTable.tBodies[0];
                var MaxRow = mazing.length - 1;
                var MaxColumn = mazing[0].length - 1;
                for (var i = 1; i < MaxRow; i++) {
                    var row = tbody.rows[i - 1];
                    for (var j = 1; j < MaxColumn; j++) {
                        var column = row.cells[j - 1];
                        var state = mazing[i][j];
                        column.style.backgroundColor = (state == 2 ? "#00ff00" : (state == 1 ? "#ff0000" : "#ffffff"));
                    }
                }
            }
           
            //分别是迷宫的数据(包括墙壁),及四个方向的(X,Y)值
            var mazing = [], direct = [], i = 0, j = 0;
            mazing[i++] = [1, 1, 1, 1, 1, 1, 1];
            mazing[i++] = [1, 0, 1, 0, 0, 0, 1];
            mazing[i++] = [1, 0, 1, 0, 1, 0, 1];
            mazing[i++] = [1, 0, 0, 0, 1, 0, 1];
            mazing[i++] = [1, 0, 1, 0, 1, 0, 1];
            mazing[i++] = [1, 0, 1, 0, 1, 0, 1];
            mazing[i++] = [1, 1, 1, 1, 1, 1, 1];
            direct[j++] = [1, 0];
            direct[j++] = [0, 1];
            direct[j++] = [-1, 0];
            direct[j++] = [0, -1];
           
           
            createTable("tbl");
            showpath(mazing, "tbl");
            var btnFind = document.getElementById("btnFind");
            btnFind.onclick = function(){
                findpath(mazing, direct, 1, 1)
            };
  </script>
 </body>
</html>

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值