如下的10个格子
填入0~9的数字。要求:连续的两个数字不能相邻。
(左右、上下、对角都算相邻)
一共有多少种可能的填数方案?
请填写表示方案数目的整数。
注意:你提交的应该是一个整数,不要填写任何多余的内容或说明性文字。
1、思路:
利用全排列(10个数10个空格,刚好符合,代码有格式)+约束条件
2、过程:
开始不知道怎么写,①本来想用一维数组的,因为全排列的题都是用一维数组,但是很麻烦,就弄了二维数组;②由于所给图案不是规则图形,为了使约束条件的统一,扩大了所给图案,变成长6,宽为5的长方形;③约束条件不用根据题目要求的左右,上下,对角线,只用左,上,上左,上右四个条件,因为其他条件的空格还没有填,所以不用理会。
3、注意
形参为二维数组时,一维的个数不能省略,二维的可以省略,例a【】【4】
4、代码
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
int count;
void swap(int *i,int *j){ //交换大小
int n=*i;
*i=*j;
*j=n;
return;
}
void perm(int a[][6],int p,int q){ //全排列
int i,j;
if(p>=3&&q>=4){ //最后一个值在3行3列
count++;
return ;
}
if(q==5){ //换行
p++;
q=1;
}
for(i=p,j=q;i!=3||j!=4;){ //前个与后面的每一个交换位置
swap(&a[i][j],&a[p][q]);
if(abs(a[p][q]-a[p][q-1])==1){ //左边
swap(&a[i][j],&a[p][q]);
j++;
if(j==5){
i++;
j=1;
}
continue;
}
if(abs(a[p][q]-a[p-1][q])==1){ //上边
swap(&a[i][j],&a[p][q]);
j++;
if(j==5){
i++;
j=1;
}
continue;
}
if(abs(a[p][q]-a[p-1][q-1])==1||abs(a[p][q]-a[p-1][q+1])==1){ //上左,上右
swap(&a[i][j],&a[p][q]);
j++;
if(j==5){
i++;
j=1;
}
continue;
}
perm(a,p,q+1);
swap(&a[i][j],&a[p][q]);
j++;
if(j==5){ //换行
i++;
j=1;
}
}
}
int main(){
int a[5][6]={{12,12,12,12,12,12},
{12,12,1,2,3,12},
{12,4,5,6,7,12},
{12,8,9,10,12,12},
{12,12,12,12,12,12}};
count=0;
perm(a,1,2);
printf("%d",count);
return 0;
}