第六题:方格填数:
填入0~9的数字。要求:连续的两个数字不能相邻。
(左右、上下、对角都算相邻)
一共有多少种可能的填数方案?
请填写表示方案数目的整数。
注意:你提交的应该是一个整数,不要填写任何多余的内容或说明性文字。
解析:
全排列+check
交换+dfs+交换
import java.util.Scanner;
import java.math.*;
public class Main
{
public static int cnt=0;
//交换函数
public static void Swap(int[]a,int i,int j)
{
int temp=a[i];
a[i]=a[j];
a[j]=temp;
}
public static void dfs(int[]a,int step)
{
//等于数组长度结束
if(step==a.length)
{
if(check(a)==true)
cnt++;//答案++
return;
}
else
{
for(int i=step;i<a.length;i++)
{
Swap(a,i,step);
dfs(a,step+1);
Swap(a,i,step);
}
}
return;
}
//蓝桥杯特色暴力check判断
public static boolean check(int[]a)
{
if((Math.abs(a[0]-a[1]))!=1 && (Math.abs(a[0]-a[3]))!=1 && (Math.abs(a[0]-a[4]))!=1 && (Math.abs(a[0]-a[5]))!=1)
{
if((Math.abs(a[1]-a[4]))!=1 && (Math.abs(a[1]-a[5]))!=1 && (Math.abs(a[1]-a[6]))!=1 && (Math.abs(a[1]-a[2]))!=1)
if((Math.abs(a[2]-a[5]))!=1 && (Math.abs(a[2]-a[6]))!=1)
if((Math.abs(a[3]-a[4]))!=1 && (Math.abs(a[3]-a[7]))!=1 && (Math.abs(a[3]-a[8]))!=1)
if((Math.abs(a[4]-a[5]))!=1 && (Math.abs(a[4]-a[9]))!=1 && (Math.abs(a[4]-a[8]))!=1 && (Math.abs(a[4]-a[7]))!=1 && (Math.abs(a[4]-a[3]))!=1)
if((Math.abs(a[5]-a[6]))!=1 && (Math.abs(a[5]-a[9]))!=1 && (Math.abs(a[5]-a[8]))!=1)
if((Math.abs(a[6]-a[9]))!=1)
if((Math.abs(a[7]-a[8]))!=1)
if((Math.abs(a[8]-a[9]))!=1)
return true;
}
return false;
}
public static void main(String[] args)
{
int[]a={0,1,2,3,4,5,6,7,8,9};
//从0开始
dfs(a,0);
System.out.println(cnt);
}
}
运行结果:1580