2016第七届蓝桥杯C/C++ B组省赛第六题

方格填数
如下的10个格子
(如果显示有问题,也可以参看【图1.jpg】)
填入0~9的数字。要求:连续的两个数字不能相邻。
(左右、上下、对角都算相邻)
一共有多少种可能的填数方案?
请填写表示方案数目的整数。
注意:你提交的应该是一个整数,不要填写任何多余的内容或说明性文字。

2016第七届蓝桥杯C/C++ B组省赛第六题_第1张图片

初看此题,很容易联想到非常经典的八皇后问题,因此解题思路大致确定为回溯算法。但作者今天准备介绍一种更加简单,理解更为容易的方法。首先将10个格子编号(如图所示),代表数组中的数a[0]~a[9]。

2016第七届蓝桥杯C/C++ B组省赛第六题_第2张图片

然后使用next_permutation();函数对0~9十个数字进行全排列,这样我们就列举出了十个数填入格子的所有可能情况。在所有情况中,再进行条件判断筛选出符合题目要求的结果。(虽然有些暴力,但作者自身觉得十分容易理解,且代码量短)

#include 
#include 
using namespace std;
//返回1代表相邻,不符合条件
int Error(int m,int n)
{
	if(m==n+1||m==n-1)
		return 1;
	return 0;
}
int main()
{
	int a[10],i,count=0,flag=1;
	for(i=0;i<10;i++)
		a[i]=i;
	while(next_permutation(a,a+10))
	{
		if(!(Error(a[0],a[1])||Error(a[1],a[2])||
			Error(a[3],a[4])||Error(a[4],a[5])||Error(a[5],a[6])||
			Error(a[7],a[8])||Error(a[8],a[9])||
			//检查行
			Error(a[3],a[7])||
			Error(a[0],a[4])||Error(a[4],a[8])||
			Error(a[1],a[5])||Error(a[5],a[9])||
			Error(a[2],a[6])||
			//检查列
			Error(a[3],a[8])||Error(a[4],a[9])||Error(a[0],a[5])||Error(a[1],a[6])||
			//检查左上至右下对角线
			Error(a[0],a[3])||
			Error(a[1],a[4])||Error(a[4],a[7])||
			Error(a[2],a[5])||Error(a[5],a[8])||
			Error(a[6],a[9])))
			//检查右上至左下对角线
		count++;
	}
	cout<

 

 

 

 

 

 

你可能感兴趣的:(原创)