递归:: 迷宫问题

<!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>
            如下图为一迷宫,假设该表格外面还有一层墙壁(不用判断是否出界),即为(row+2,column+2)的表格,
            其中红色不可通行(状态为1),白色为可通行路径(状态为0),入口为左上的顶点(1,1),
            出口为右下顶点(row,column),这只老鼠要从入口走到出口,路径为绿色。
        </p>
        <p>
            递归算法如下:假设这只老鼠现在在任何一个位置(i,j),它有上下左右四个方面可走,
            如果为红色或碰到墙壁,如该方向不可行,如果可行(状态改为2)并且是出口的话,就打印出结果
        </p>
        <p>
            <input type="button" id="btnFind" name="btnFind" value="显示路径"/>
        </p>
        <script type="text/javascript">
            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);
            }
           
            function findpath(mazing, direct, row, column){
                var MaxRow = mazing.length - 2;
                var MaxColumn = mazing[0].length - 2;
                for (var i = 0, cnt = direct.length; i < cnt; i++) {
                    var nextrow = row + direct[i][0];
                    var nextcolumn = column + direct[i][1];
                    if (mazing[nextrow][nextcolumn] == 0) {
                        mazing[nextrow][nextcolumn] = 2; //标记为已走过,不可以再走
                        if (nextrow == MaxRow && nextcolumn == MaxColumn) {
                            showpath(mazing, "tbl2");
                        }
                        else {
                            findpath(mazing, direct, nextrow, nextcolumn)
                        }
                        mazing[nextrow][nextcolumn] = 0; // 查询结束,表明该路径不成功,则恢复所有原先的标志。
                    }
                }
            }
           
            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("tbl2");
            showpath(mazing, "tbl2");
            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、付费专栏及课程。

余额充值