mousegomaze2.htm
来自「“常见程式演算”主要收集一些常见的程式练习题目」· HTM 代码 · 共 108 行
HTM
108 行
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<link rel="stylesheet" href="css/stdlayout.css" type="text/css">
<link rel="stylesheet" href="css/print.css" type="text/css">
<meta content="text/html; charset=gb2312" http-equiv="content-type">
<title>老鼠走迷官(二)</title>
</head>
<body>
<h3><a href="http://caterpillar.onlyfun.net/GossipCN/index.html">From
Gossip@caterpillar</a></h3>
<h1><a href="AlgorithmGossip.htm">Algorithm Gossip: 老鼠走迷官(二)</a></h1>
<h2> 说明</h2>
由于迷宫的设计,老鼠走迷宫的入口至出口路径可能不只一条,如何求出所有的路径呢?<br>
<h2>解法</h2>
求所有路径看起来复杂但其实更简单,只要在老鼠走至出口时显示经过的路径,然后退回上一格重新选择下一个位置继续递回就可以了,比求出单一路径还简单,我们的程式只要作一点修改就可以了。 <br>
<h2> 演算法</h2>
<pre>Procedure GO(maze[]) [<br> VISIT(maze, STARTI, STARTJ);<br>]<br> <br>Procedure VISIT(maze[], i, j) [<br> maze[i][j] = 1; <br><br> IF(i == ENDI AND j == ENDJ) [<br> // FIND A ROUTE, PRINT THE ROUTE<br> ]<br><br> IF(maze[i][j+1] == 0)<br> VISIT(maze, i, j+1); <br> IF(maze[i+1][j] == 0)<br> VISIT(maze, i+1, j); <br> IF(maze[i][j-1] == 0)<br> VISIT(maze, i, j-1); <br> if(maze[i-1][j] == 0)<br> VISIT(maze, i-1, j); <br><br> maze[i][j] = 0; <br>] <br></pre>
<h2> 实作</h2>
<ul>
<li> C
</li>
</ul>
<pre>#include <stdio.h><br>#include <stdlib.h> <br><br>void visit(int, int);<br><br>int maze[9][9] = {{2, 2, 2, 2, 2, 2, 2, 2, 2},<br> {2, 0, 0, 0, 0, 0, 0, 0, 2},<br> {2, 0, 2, 2, 0, 2, 2, 0, 2},<br> {2, 0, 2, 0, 0, 2, 0, 0, 2},<br> {2, 0, 2, 0, 2, 0, 2, 0, 2},<br> {2, 0, 0, 0, 0, 0, 2, 0, 2},<br> {2, 2, 0, 2, 2, 0, 2, 2, 2},<br> {2, 0, 0, 0, 0, 0, 0, 0, 2},<br> {2, 2, 2, 2, 2, 2, 2, 2, 2}};<br><br>int startI = 1, startJ = 1; // 入口<br>int endI = 7, endJ = 7; // 出口<br><br>int main(void) { <br> int i, j; <br><br> printf("显示迷宫:\n"); <br> for(i = 0; i < 9; i++) { <br> for(j = 0; j < 9; j++) <br> if(maze[i][j] == 2) <br> printf("█"); <br> else <br> printf(" "); <br> printf("\n"); <br> } <br><br> visit(startI, startJ);<br><br> return 0; <br>} <br><br>void visit(int i, int j) {<br> int m, n;<br><br> maze[i][j] = 1; <br><br> if(i == endI && j == endJ) {<br> printf("\n显示路径:\n");<br> for(m = 0; m < 9; m++) {<br> for(n = 0; n < 9; n++)<br> if(maze[m][n] == 2)<br> printf("█");<br> else if(maze[m][n] == 1)<br> printf("◇");<br> else<br> printf(" ");<br> printf("\n");<br> }<br> }<br><br> if(maze[i][j+1] == 0) visit(i, j+1);<br> if(maze[i+1][j] == 0) visit(i+1, j);<br> if(maze[i][j-1] == 0) visit(i, j-1);<br> if(maze[i-1][j] == 0) visit(i-1, j);<br><br> maze[i][j] = 0;<br>} <br></pre>
<br>
<ul>
<li> Java
</li>
</ul>
<pre>public class Mouse {<br> private int startI, startJ; // 入口 <br> private int endI, endJ; // 出口<br> <br> public static void main(String[] args) {<br> int maze[][] = {{2, 2, 2, 2, 2, 2, 2, 2, 2},<br> {2, 0, 0, 0, 0, 0, 0, 0, 2},<br> {2, 0, 2, 2, 0, 2, 2, 0, 2},<br> {2, 0, 2, 0, 0, 2, 0, 0, 2},<br> {2, 0, 2, 0, 2, 0, 2, 0, 2},<br> {2, 0, 0, 0, 0, 0, 2, 0, 2},<br> {2, 2, 0, 2, 2, 0, 2, 2, 2},<br> {2, 0, 0, 0, 0, 0, 0, 0, 2},<br> {2, 2, 2, 2, 2, 2, 2, 2, 2}};<br> <br> System.out.println("显示迷宫:"); <br> for(int i = 0; i < maze.length; i++) { <br> for(int j = 0; j < maze[0].length; j++) <br> if(maze[i][j] == 2) <br> System.out.print("█"); <br> else <br> System.out.print(" "); <br> System.out.println(); <br> }<br><br> Mouse mouse = new Mouse();<br> mouse.setStart(1, 1);<br> mouse.setEnd(7, 7);<br> <br> mouse.go(maze);<br> }<br> <br> public void setStart(int i, int j) {<br> this.startI = i;<br> this.startJ = j;<br> }<br> <br> public void setEnd(int i, int j) {<br> this.endI = i;<br> this.endJ = j;<br> }<br> <br> public void go(int[][] maze) {<br> visit(maze, startI, startJ);<br> }<br> <br> private void visit(int[][] maze, int i, int j) {<br> maze[i][j] = 1; <br><br> if(i == endI && j == endJ) {<br> System.out.println("\n找到出口!");<br> for(int m = 0; m < maze.length; m++) { <br> for(int n = 0; n < maze[0].length; n++) { <br> if(maze[m][n] == 2) <br> System.out.print("█"); <br> else if(maze[m][n] == 1) <br> System.out.print("◇"); <br> else <br> System.out.print(" "); <br> } <br> System.out.println();<br> }<br> }<br><br> if(maze[i][j+1] == 0) <br> visit(maze, i, j+1); <br> if(maze[i+1][j] == 0)<br> visit(maze, i+1, j); <br> if(maze[i][j-1] == 0)<br> visit(maze, i, j-1); <br> if(maze[i-1][j] == 0)<br> visit(maze, i-1, j); <br> <br> maze[i][j] = 0;<br> }<br>}</pre>
<br>
</body>
</html>
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?