迷宫问题
通过递归让目标从黑点走到蓝点
package com.data.migong;
public class MiGong {
public static void main(String[] args) {
int[][] map=new int[8][7];//根据地图创建二维数组
for (int i = 0; i <7 ; i++) {
map[0][i]=1;
map[7][i]=1;
}
for (int i = 0; i <8 ; i++) { //设置地图的边框 值为1
map[i][0]=1;
map[i][6]=1;
}
map[3][1]=1;
map[3][2]=1;
//遍历原始二维数组
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();
}
System.out.println("--------------------------");
run(map,1,1);//设置起点,让目标开始走的位置
//遍历走过后的二维数组
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();
}
}
/**
*
* @param map 传递二维数组,即地图
* @param i 目标起点的位置
* @param j 目标起点的位置
* @return 返回值代表递归结束的条件 true表示该点可以走,程序继续执行,false表示不能走做
*/
public static boolean run(int[][] map, int i, int j){
if (map[6][5]==2){//判断如果下标6 5 的值为2 表示能走并且 走过此位置
return true;
}else {
if (map[i][j]==0){//如果当前位置没走过 让其按照下右上左的策略走
map[i][j]=2;//假定当前位置 能走
if (run(map,i,j-1)){//下走
return true;
}else if (run(map,i-1,j)){//右
return true;
}else if (run(map,i,j+1)){//上
return true;
}else if (run(map,i+1,j)){//左
return true;
}else {//表示 四个方向都不能走,将该坐标设置为3
map[i][j]=3;
return false;
}
}else {//如果当前位置不是0 ,为1,2,3 表示可能 为墙,走过,走过不通畅
return false;
}
}
}
}
八皇后问题
八皇后问题,是一个古老而著名的问题,是回溯算法的典型案例。该问题是国际西洋棋棋手马克斯·贝瑟尔于1848 年提出:在 8×8 格的国际象棋上摆放八个皇后,使其不能互相攻击,即:任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法(92
package com.data.Queue8;
/**
* 创建八皇后类
* 用一位数组存储每行 皇后棋落点的列
*/
public class Queue8_1 {
int max=8;//定义一位数组的长度
int[] array=new int[8];//创建一位数组
int count=0;//用来记录 排列方式的总数
public static void main(String[] args) {
Queue8_1 queue8_1=new Queue8_1();//创建对象
queue8_1.run(0);//让第一个皇后落在第一行第一个位置
System.out.println(queue8_1.count);
}
/**
* run方法
* 首先判断摆到第几个小球了,如果n=8即表示已经摆完8个小球了,退出程序即可
* 如果没摆完,让其从第n行的第i个位置开始摆放,没摆放完判断是否正确
* 如果正确继续摆放下一行,一直到n==8;
* @param n
*/
public void run(int n){
if (n==max){//如果n=8 表示已经摆放完成8个皇后
count++;
return;
}
for (int i = 0; i <max ; i++) {
array[n]=i;//将皇后第n+1行的第i+1 位置
if (panduan(n)){//判断是否成立
run(n+1);//如果成立就继续摆放下一个
}
//如果不成立 就将球摆放到i+1 位置继续判断
}
}
/**
* 判断在当前位置摆放皇后 是否正确
* @param n 表示行数
* @return
*/
public boolean panduan(int n){
for (int i = 0; i <n ; i++) {
//如果列数出现重复 或者 出现在斜线位置 就返回false
if (array[i]==array[n] ||Math.abs(n-i)==Math.abs(array[n]-array[i])){
return false;
}
}
return true;//如果没问题 返回true
}
}