2016年第七届蓝桥杯C/C++B组省赛——方格填数

如下的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;
} 

猜你喜欢

转载自blog.csdn.net/qq_42757083/article/details/104574000