バックの問題の再帰的な迷路
- 迷路は、二次元配列で表さ
- 1で壁や障害物を表し、
- 図2は、2証跡が通路であることを示している使用は、その時点の後、点を来たことを示し
- 3は通過し、との点を示しているが、歩道行き止まり
- 迷路は、経路選択の方向を指すことにある
ベースコード:
package maze.migong;
public class Maze {
public static void main(String[] args) {
//创建一个二维数组,用来模拟迷宫---地图
int [][] map = new int [11][12];
//使用1表示墙,地图四周都是用墙围起来的
for(int i = 0 ; i < 12;i ++){
map[0][i] = 1;
map[10][i] = 1;
}
for (int i = 0; i < 11; i++){
map[i][0] = 1;
map[i][11] = 1;
}
//设置障碍物
for (int i = 0;i < 4;i ++){
map[5][i] = 1;
map[i][8] = 1;
map[i][6] = 1;
map[2][i] = 1;
map[i + 4][5] = 1;
}
//输出地图
for(int i = 0 ;i < 11;i ++){
for(int j = 0;j < 12;j ++ ){
System.out.print(" " + map[i][j]);
}
System.out.println();
}
}
/**
*
* @param map map表示地图
* @param i
* @param j i和j分别表示开始的坐标
* @return 如果返回值为true表示已经找到路,如果返回false那就是没有找到路
*/
public abstract boolean setWay(int[][] map , int i , int j){
}
}
個々のアイデアの分析:
私のコード:
public static boolean setWay(int[][] map , int i , int j){
//这个方法的含义是什么?直接找到到达终点的路吗?
//作为递归方法
if(map[9][10] == 2){
return true;
//到达终点作为递归条件的截止
//那原来的点都是0,你得有赋值的语句才行
}else{
if(map[i][j] == 0){
//如果你传进来的点没有走过,那就以你传进来的点开始走
map[i][j] = 2; //假设该点可以走通,按照下--右--上--左的路径走完
if(map[i - 1][j] == 0 && setWay(map,i + 1,j)){ //向下走
return true;
}else if(map[i][j + 1] == 0 && setWay(map,i,j + 1)){ //向右走
return true;
}else if(map[i + 1][j] == 0 && setWay(map,i -1,j)){ //向上走
return true;
}else if(map[i][j - 1] == 0 && setWay(map,i,j - 1)){ //向左走
return true;
}else{
//说明该点走不通是死路
map[i][j] = 3;
return false;
}
}else if(map[i][j] == 1){
return false;
}else if(map[i][j] == 2){
return false;
}else{
return false;
}
}
}
}
結果:
分析の結果:
無限ループ、それがダウンして行くべき道、選択の余地がダウン。
問題が解決:
行くには間違った決定文を行くことができるかどうかを判断するには以下下る、あなたが左に行くことができるかどうかを判断するために残しました。
第二の動作
図のステップ。
分析の結果:
- 目に見えない機能、トラックのも、デッドエンド部との間試行錯誤で、それは3としてマークされます。
- 一方、ここでの出力は、彼が最終的な値は、印刷の開始に戻されたときに決定するために別のメソッドを呼び出すたびに、結果の逆順であります
- 間違った経路が非常に長く、彼は非常に多くのスタックを開いて、行き止まりを発見された場合、空間と時間の多くを無駄にしないだろう、戻って、戻ってきます。すべての決定は、非常に多くの再帰呼び出しスタック開いていなければなりません。
コースコード:
public static boolean setWay(int[][] map , int i , int j){
//这个方法的含义是什么?直接找到到达终点的路吗?
//作为递归方法
if(map[9][10] == 2){
return true;
//到达终点作为递归条件的截止
//那原来的点都是0,你得有赋值的语句才行
}else{
if(map[i][j] == 0){
//如果你传进来的点没有走过,那就以你传进来的点开始走
map[i][j] = 2; //假设该点可以走通,按照下--右--上--左的路径走完
if(setWay(map,i - 1,j)){
System.out.print(" 往上走");//向下走
return true;
}else if(setWay(map,i,j + 1)){
System.out.println(" 往右走");//向右走
return true;
}else if(setWay(map,i + 1,j)){
System.out.print(" 往下走");//向上走
return true;
}else if(setWay(map,i,j - 1)){
System.out.println(" 往左走");//向左走
return true;
}else{
//说明该点走不通是死路
System.out.println("此路不通");
map[i][j] = 3;
return false;
}
}else{
//其实只要出现三种情况1、2、3都不可以再走了,所以都是一样的,没必要单列出来
return false;
}
}
}
比較分析とサマリー:
1.私は条件が行き止まりパスの末尾に判断された場合、あなたが行く前に、それらがどのように決定させる、すべてのステップを決意条件再帰の多くを開くためにする必要があり、再帰的なプログラムの数が増加すると思います次のステップは、すぐにプログラムを実行する時間の値を減らすことができますか?あなたの値は、一度に2になるように、それは4つの方向2持っているかどうかを判断するために想定しているが
、その後、あなたは彼が死んだ道を終了しないことを選択した場合、2旅のポイント2の主題であることをすべての2に校正される前に、選択されたパスがあることを示す、3となり行き止まり
、彼らが事前に設定されますが、前の通りを歩いたことができる3方向は、それはそれを行っていませんどのように、どの遠くてはなりませんか?
私は規定が左にある開始した場合は4アウト再帰条件の一方向のみであってはならない、右側には、道路のこの時点の最初の段落の最初の行は、無限ループに突入しました。