题目描述
如下的10个格子
填入0~9的数字。要求:连续的两个数字不能相邻。(左右、上下、对角都算相邻)
一共有多少种可能的填数方案?
解决方法
import java.util.ArrayList;
public class B_6 {
public static ArrayList<Integer> path = new ArrayList<>();
public static int num;
public static void backtracking(int[] arr,boolean[] used) {
if(path.size()==arr.length) {
test(path);
return;
}
for (int i = 0; i < arr.length; i++) {
if(used[i]) continue;
used[i] = true;
path.add(arr[i]);
backtracking(arr, used);
path.remove(Integer.valueOf(arr[i]));
used[i] = false;
}
}
private static void test(ArrayList<Integer> p) {
if(p.get(0)+1==p.get(1)||p.get(0)+1==p.get(3)||p.get(0)+1==p.get(4)||p.get(0)+1==p.get(5)) return;
if(p.get(1)+1==p.get(0)||p.get(1)+1==p.get(2)||p.get(1)+1==p.get(4)||p.get(1)+1==p.get(5)||p.get(1)+1==p.get(6)) return;
if(p.get(2)+1==p.get(1)||p.get(2)+1==p.get(5)||p.get(2)+1==p.get(6)) return;
if(p.get(3)+1==p.get(0)||p.get(3)+1==p.get(4)||p.get(3)+1==p.get(7)||p.get(3)+1==p.get(8)) return;
if(p.get(4)+1==p.get(0)||p.get(4)+1==p.get(1)||p.get(4)+1==p.get(3)||p.get(4)+1==p.get(5)||p.get(4)+1==p.get(7)||p.get(4)+1==p.get(8)||p.get(4)+1==p.get(9)) return;
if(p.get(5)+1==p.get(0)||p.get(5)+1==p.get(1)||p.get(5)+1==p.get(2)||p.get(5)+1==p.get(4)||p.get(5)+1==p.get(6)||p.get(5)+1==p.get(8)||p.get(5)+1==p.get(9)) return;
if(p.get(6)+1==p.get(1)||p.get(6)+1==p.get(2)||p.get(6)+1==p.get(5)||p.get(6)+1==p.get(9)) return;
if(p.get(7)+1==p.get(3)||p.get(7)+1==p.get(4)||p.get(7)+1==p.get(8)) return;
if(p.get(8)+1==p.get(3)||p.get(8)+1==p.get(4)||p.get(8)+1==p.get(5)||p.get(8)+1==p.get(7)||p.get(8)+1==p.get(9)) return;
if(p.get(9)+1==p.get(4)||p.get(9)+1==p.get(5)||p.get(9)+1==p.get(6)||p.get(9)+1==p.get(8)) return;
num++;
}
public static void main(String[] args) {
int[] a = {0,1,2,3,4,5,6,7,8,9};
boolean[] used = {false,false,false,false,false,false,false,false,false,false};
backtracking(a, used);
System.out.println(num);
}
}