蓝桥杯:2016年第七届蓝桥杯省赛B组第六题—方格填数

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/belous_zxy/article/details/84351283

如下的10个格子

(如果显示有问题,也可以参看【图1.jpg】)

填入0~9的数字。要求:连续的两个数字不能相邻。
(左右、上下、对角都算相邻)

一共有多少种可能的填数方案?

请填写表示方案数目的整数。
注意:你提交的应该是一个整数,不要填写任何多余的内容或说明性文字。


DFS

全排列,判断是否相邻。

#include<stdio.h>
#include<stdlib.h>
#include<stdbool.h>
#include<string.h>
int matrix[5][6]={0};
bool book[10]={false};
int sum=0,x,y;
bool check(void)
{
	const int goxy[9][2]={{-1,-1},{-1,0},{-1,1},{0,-1},{0,1},{1,-1},{1,0},{1,1}};
	for(int i=1;i<=3;i++)
	{
		for(int j=1;j<=4;j++)
		{
			if(i==1&&j==1||i==3&&j==4)
				continue;
			int temp1=matrix[i][j]-1;
			int temp2=matrix[i][j]+1;
			for(int k=0;k<9;k++)
			{
				int tx=i+goxy[k][0];
				int ty=j+goxy[k][1];
				if(matrix[tx][ty]==temp1||matrix[tx][ty]==temp2)
					return false;
			}
		}
	}
	return true;
}
void DFS(int sp)
{
	if(sp==11)
	{
		if(check())
			sum++;
		return;
	}
	for(int i=0;i<10;i++)
	{
		if(book[i])
			continue;
		book[i]=true;
		matrix[x][y]=i;
		if(y==4)
		{
			x++,y=1;
			DFS(sp+1);
			x--,y=4;
		}
		else
		{
			y++;
			DFS(sp+1);
			y--;
		}
		book[i]=false;
	}
}
int main(int argc,char **argv)
{
	x=1,y=2;
	for(int i=0;i<5;i++)
		for(int j=0;j<6;j++)
			matrix[i][j]=1<<30;
	DFS(1);
	printf("%d\n",sum);
	return EXIT_SUCCESS;
}

END

猜你喜欢

转载自blog.csdn.net/belous_zxy/article/details/84351283