如果显示有问题,也可以参看【图1.jpg】)
填入0~9的数字。要求:连续的两个数字不能相邻。
(左右、上下、对角都算相邻)
一共有多少种可能的填数方案?(数字不能重复使用)
请填写表示方案数目的整数。
博主用全排列的方法写的算法
import java.util.Arrays;
public class ListBox {
public static void main(String[] args) {
// TODO 自动生成的方法存根
int an[]=new int[10];
for(int i=0;i<an.length;i++)
{
an[i]=i;
}
List perm=new List(an);
System.out.println(perm.count);
}
}
class List{
int a[];
int list[]=new int[30];
int count=0;
void print(){
//扩大格子,并给格子赋值
for(int x=0;x<list.length;x++)
{
list[x]=12;
}
list[8]=a[0];
list[9]=a[1];
list[10]=a[2];
list[13]=a[3];
list[14]=a[4];
list[15]=a[5];
list[16]=a[6];
list[19]=a[7];
list[20]=a[8];
list[21]=a[9];
for(int x=0;x<list.length;x++)
{
if(list[x]/10!=0)
{
continue;
}
if(!check(x))
{
return; //如果不符合,结束print()方法
}
}
count++;
}
public List(int[] a)
{
this.a=a;
perm(0);
}
boolean check(int ps)
{
if(Math.abs(list[ps]-list[ps-6])==1||Math.abs(list[ps]-list[ps-7])==1||Math.abs(list[ps]-list[ps-5])==1
||Math.abs(list[ps]-list[ps-1])==1||Math.abs(list[ps]-list[ps+1])==1||Math.abs(list[ps]-list[ps+6])==1
||Math.abs(list[ps]-list[ps+5])==1||Math.abs(list[ps]-list[ps+7])==1)
{
return false;
}
return true;
}
void perm(int offset)
{
if(offset==a.length-1)
{
print();
return;
}
else
{
for(int i=offset;i<a.length;i++)
{
swap(i,offset);
perm(offset+1);
swap(offset,i);
}
}
}
void swap(int i,int offset)
{
int temp;
temp=a[i];
a[i]=a[offset];
a[offset]=temp;
}
}
大家都看出来了,我这里吧十个格子扩展格子成了30个5X6的,这样每个都可以检查周围8个格子了