如下的10个格子
在这里插入图片描述
填入0~9的数字。要求:连续的两个数字不能相邻。
(左右、上下、对角都算相邻)
一共有多少种可能的填数方案?
请填写表示方案数目的整数。
注意:你提交的应该是一个整数,不要填写任何多余的内容或说明性文字。
解法:dfs全排列,然后判断
package 第七届;
//1580
public class _06方格填数dfs {
public static void main(String[] args) {
int nums[] = {0,1,2,3,4,5,6,7,8,9};
int vis[] = new int[10];
int ans = 0;
ans = dfs(vis,nums,0);
System.out.println(ans);
}
private static int dfs(int[] vis, int[] nums, int k) {
int ans = 0;
if(k == 10) {
if(check(nums)) {
for(int i = 0; i < nums.length; i++) {
System.out.print(nums[i]);
}
System.out.println();
return 1;
}
}
for(int i = 0; i < 10; i++) {
if(vis[i] == 0) {
vis[i] = 1;
nums[k] = i;
ans += dfs(vis,nums,k+1);
vis[i] = 0;//回溯
}
}
return ans;
}
private static boolean check(int[] nums) {//注意此处太容易写错了
if(Math.abs(nums[0]-nums[1]) == 1 || Math.abs(nums[0]-nums[3]) == 1 || Math.abs(nums[0]-nums[4]) == 1 || Math.abs(nums[0]-nums[5]) == 1
|| Math.abs(nums[1]-nums[2]) == 1 || Math.abs(nums[1]-nums[4]) == 1 || Math.abs(nums[1]-nums[5]) == 1 || Math.abs(nums[1]-nums[6]) == 1
|| Math.abs(nums[2] - nums[5]) == 1 || Math.abs(nums[2] - nums[6]) == 1
|| Math.abs(nums[3] - nums[4]) == 1 || Math.abs(nums[3] - nums[7]) == 1 || Math.abs(nums[3] - nums[8]) == 1
|| Math.abs(nums[4] - nums[5]) == 1 || Math.abs(nums[4] - nums[7]) == 1 || Math.abs(nums[4] - nums[8]) == 1 || Math.abs(nums[4] - nums[9]) == 1
|| Math.abs(nums[5] - nums[6]) == 1 || Math.abs(nums[5] - nums[9]) == 1 || Math.abs(nums[5] - nums[8]) == 1
|| Math.abs(nums[6] - nums[9]) == 1
|| Math.abs(nums[7] - nums[8]) == 1
|| Math.abs(nums[8] - nums[9]) == 1){
return false;
}
return true;
}
}