回溯算法
迷宫回溯
代码实现
package recursion;
public class MiGong {
public static void main(String[] args) {
//创建地图
int[][] map = new int[8][7];
//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;
}
//设置挡板,1表示
map[3][1]=1;
map[3][2]=1;
map[1][2]=1;
map[1][3]=1;
map[1][4]=1;
map[4][3]=1;
System.out.println("地图情况");
for (int i=0;i< map.length;i++){
for (int j=0;j<map[0].length;j++){
System.out.print(map[i][j]+" ");
}
System.out.println();
}
setWay(map,1,1);
System.out.println("路线情况");
for (int i=0;i< map.length;i++){
for (int j=0;j<map[0].length;j++){
System.out.print(map[i][j]+" ");
}
System.out.println();
}
}
//map表示地图
//i,j 表示从地图的那个位置开始出发 (1,1)
//如果小球能到map[6][5]位置,则说明路已经找到
//0;表示该点没有走过 1;表示该点为墙 2;表示可以走 3;表示走过了,但走不通
//左-下-右-上
/**
* @param map 表示地图
* @param i 从哪个位置开始找
* @param j
* @return 找到返回true
*/
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,j-1)){//向左走
return true;
}else if (setWay(map, i-1, j)){//向上走
return true;
}
map[i][j] = 3;
return false;
}else {//如果map[i][j] != 0,可能是1,2,3
return false;
}
}
}
}
八皇后问题
皇后与皇后不能再同一行,同一列,同一斜线
代码实现
package recursion;
public class Queue8 {
//定义共有多少个皇后
int max = 8;
//定义数组array,保存位置的结果
int[] arr = 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){//n=8, 8个皇后都放好了
print();
count++;
return;
}
//依次放入皇后,并判断是否冲突
for (int i=0;i<max;i++){
//先把当前的皇后n,放到该行的第一列
arr[n] = i;
//判断当前位置放置皇后时,冲突不
if (judge(n)){//不冲突
//放下一个皇后
check(n+1);
}
}
}
//判断我们摆放时有没有冲突
/**
* @param n 表示第n个皇后
* @return
*/
private boolean judge(int n){
for (int i = 0; i < n; i++) {
//Math.abs(n-1) == Math.abs(arr[n] - arr[i]) 判断是否在同一斜线
//相当于横纵坐标插值是否相等(列距等于行距)
if (arr[i] == arr[n] || Math.abs(n-i) == Math.abs(arr[n] - arr[i]) ){
return false;
}
}
return true;
}
//输出皇后的摆放位置
private void print(){
for (int i = 0; i < arr.length; i++) {
System.out.print(arr[i]+" ");
}
System.out.println();
}
}