回溯法也是递归的一种,就是不满足条件的时候退出当前的递归执行回前面的for循环
经典问题有八皇后问题,以行作为顺序然后开始遍历,每一行都尝试8列(8次),每一行都从第一列开始尝试,如果满足则继续递归下一行,不满足则尝试下一列。代码里只有两个for语句,但实际上利用枚举执行了至少8!=40320的情况
package 算法练习;
public class 八皇后问题 {
static int total=0;
static int[] arr=new int[8];
static void tongji(int hang)
{
//如果行数执行到8,total加1
if(hang==8)
{
total=total+1;
}
else
{
for(int i=0;i<8;i++)
{
//放在行的哪个位置
int flag=0;
//行放在了第i列
arr[hang]=i;
//该循环为检查
//第0行不用检查
for(int j=0;j<hang;j++)
{
//排除列和斜行的问题
if(arr[hang]==arr[j]||hang-arr[hang]==j-arr[j]||hang+arr[hang]==j+arr[j])
{
flag=1;
break;
}
}
//检查成功
if(flag==0)
{
tongji(hang+1);
}
}
}
}
public static void main(String[] args) {
// TODO Auto-generated method stub
tongji(0);
System.out.println(total);
}
}