여덟 여왕의 문제를 다시 미로

재귀의 개념

간단하게 말해서 : 자신을 호출하는 재귀 방법은, 다른 변수를 전달 각각의 호출은, 재귀 복잡한 문제를 해결하기 위해 프로그래머가 도움이 될 수 있습니다, 그리고 코드를 간단하게 만들 수 있습니다

package recusion;

public class RecursionTest {

    public static void main(String[] args) {
        test(5);
        int i = factorial(5);
        System.out.println(i);
    }
    //打印问题
    //当程序执行到一个方法时,就会开辟一个独立的栈空间
    public static void test(int n) {
        if(n>2) {
            test(n-1);
        }
        System.out.print("n="+n+" ");//n=2 n=3 n=4 n=5 
    }
    //阶乘问题
    public static int factorial(int n) {
        if( n == 1) {
            return 1;
        }else {
            return factorial(n-1)*n;
        }
    }
}

IMGIMG

당신이 따라야 재귀 중요한 규칙

1. 새로운 보호의 별도 공간 (스택 공간)을 생성하는 방법을 실행

2. 로컬 변수의 방법과 무관 방법에 사용되는 양이 변수 참조의 형식 인 경우, 서로 영향을 미치지 않는 경우에는 참조 데이터 유형을 공유

조건 3. 재귀 방법은 재귀를 철회, 또는 무한 재귀입니다한다

4. 방법은 완료, 또는 수익을 발생하면 누가 (이 방법은 또는,이 방법은 완료 반환이 완료 같은 시간에 결과를 반환합니다 부르는 관찰, 반환하는 경우 스택의 코드 실행 완료) 호출자에게 리턴됩니다

문제를 다시 미로

package recusion;

import java.util.ArrayList;
import java.util.List;

public class MiGong {

    public static void main(String[] args) {
        //先创建一个二维数组,模拟迷宫
        //地图
        //map[0][0]
        
        List<Integer> ls = new ArrayList<Integer>();
        
        int[][] map = new int[8][7];
        //使用1表示墙
        //上下全部置为1,用来作为迷宫的墙
        for(int i=0; i<7;i++) {
            map[0][i]=1;
            map[7][i]=1;
        }
        for(int i=0;i<8;i++) {
            map[i][0]=1;
            map[i][6]=1;
        }
        //设置挡板
        map[3][1]=1;
        map[3][2]=1;
//      for(int i=0;i<8;i++) {
//          for(int j=0;j<7;j++) {
//              System.out.print(map[i][j]+" ");
//          }
//          System.out.println();
//      }
        System.out.println("========================");
        setWay(map,1,1);
        //输出新的地图
        for(int i=0;i<8;i++) {
            for(int j=0;j<7;j++) {
                System.out.print(map[i][j]+" ");
            }
            System.out.println();
        }

    }

    //使用递归回溯来归小球找路
    //1.map 表示地图
    //2.i,j表示从地图的那个位置开始出发
    //3.如果小球能到map[6][5]位置,则说明通路找到
    //4.约定:当map[i][j]为0表示该定没有走过  当为1表示墙  为2表示通路可以走;3表示改点已经走过,但是走不通
    //5.在走迷宫时,需要确定一个策略 下 ->右 ->上->左,如果改点走不通,在回溯
    public static boolean setWay(int[][] map,int i,int j) {
        if(map[6][5] == 2) {//通路已经找到
            return true;
        }else {
            if(map[i][j] == 0) {//如果当前这个点还没有走过
                //按照策略 下 ->右 ->上->左 走
                map[i][j] = 2;//假定改点可以走通
                if(setWay(map,i+1,j)) {//向下走
                    return true;
                }else if(setWay(map,i,j+1)) {
                    return true;
                }else if(setWay(map,i-1,j)) {
                    return true;
                }else if(setWay(map,i,j-1)) {
                    return true;
                }else {
                    map[i][j]=3;
                    return false;
                }
            }else {
                return false;
            }
        }
    }

}

8 여왕의 문제

여왕이 직접 여왕을 다른를 먹을 수 있도록, 어떻게 체스 보드 8 × 8 8 개 개의 퀸을 배치 할 수 있습니다 여덟 여왕의 문제는 배경 질문으로 체스 있나요? 이를 위해, 두 퀸즈 또는 대각선 길이, 폭에서 동일하지 않다.

생각의 여덟 왕비 문제 분석

  1. 첫 번째 여왕의 우선 첫 번째 행의 첫 번째 열을 넣어
  2. 제 번째 행의 첫 번째 열에 퀸하고 서로 공격이 모든 컬럼 이어 두번째 열 번째 행에서 행해진 다 계속되면 서로 공격 여부를 결정하고 적절한를 찾을
  3. 그것은 정확한 솔루션을 발견 여덟 개 즈가 충돌하는 위치에 배치 할 수 없을 때까지 퀸 .... 제, 또는 제 1 열, 제 2 열을 계속
  4. 역 추적하기 시작합니다 스택에 다시 떨어 스택에 정확한 솔루션을 얻을 때, 첫 번째는 모든 얻을 첫 번째 열에 모든 권리 솔루션, 여왕에 관한 것입니다
  5. 그 후, 두 번째 열 퀸 계속 다시 말해서, 루프 계속 다시 단계 1,2,3,4 수행

도착 [I]는 = 브로는 브로 난 1 여왕 나타낸다 + I + 1 행의 첫 번째 열에 브로 + 1

package recusion;

import java.lang.reflect.Array;

public class Queue8 {
    int max = 8;
    int[] array = new int[max];
    static int count=0;
    public static void main(String[] args) {
        Queue8 queue8 = new Queue8();
        queue8.check(0);
        System.out.println(count);
        
    }
    //编写一个方法,放置第n个皇后
    private void check(int n) {
        if(n == max) {
            print();
            return;
        }
        //依次放入皇后,判断是否冲突
        for(int i=0;i<max;i++) {
            array[n]=i;
            //判断当放置第n个皇后到i列时,是否冲突
            if(judge(n)) {//不冲突
                //接着放n+1个皇后,即开始递归
                check(n+1);
            }
            
            //如果冲突,就继续执行array[n]=i;即将第n个皇后,放置在本行的后移的一个位置
        }
    }
    //查看当我们放置第n个皇后,就去检测该皇后是否和前面已经摆放的皇后冲突
    //array[i]==array[n]表示判断第n个皇后是否和前面的n-1个皇后在同一列
    //Math.abs(n-i)==Math.abs(array[n]-array[i]))表示判断第n个皇后是否和第i皇后是否在同一个斜线
    private boolean judge(int n) {
        for(int i=0;i<n;i++) {
            if(array[i]==array[n]||Math.abs(n-i)==Math.abs(array[n]-array[i])) {
                return false;
            }
        }
        return true;
    }
    
    //写一个方法,可以将皇后摆放的位置输出
    private void print() {
        count++;
        for(int i=0;i<array.length;i++) {
            System.out.print(array[i]+" ");
        }
        System.out.println();
    }
}

추천

출처www.cnblogs.com/train99999/p/11116649.html