您的位置:首页 > 编程语言 > C语言/C++

2016蓝桥杯C/C++A组填数字

2016-04-01 12:25 295 查看
方格填数

如下的10个格子

+--+--+--+

| | | |

+--+--+--+--+

| | | | |

+--+--+--+--+

| | | |

+--+--+--+

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

填入0~9的数字。要求:连续的两个数字不能相邻。

(左右、上下、对角都算相邻)

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

请填写表示方案数目的整数。

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



此题是一道典型的深搜题目,因为是填空题,不需要考虑效率,若用C++的库函数(next_permutation)直接写也是很方便的,用了此库函数可直接进行数次if判断就可得出结果。

首先,将原图进行拆分整合,得下图

Download
as text

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40


#include<iostream>
#include<algorithm>                   //算法头文件,包含许多十分方便的库函数(next_permutation()就在其中)
#include<cmath>				//数学头文件fabs()是绝对值的库函数
using namespace std;
int main()
{
int a[20],sum=0;
for(int i=0;i<10;i++)
a[i]=i;

//进行题目所需的判断
do{
if(fabs((double)(a[0]-a[1]))!=1&&fabs((double)(a[0]-a[3]))!=1&&fabs((double)(a[0]-a[4]))!=1&&fabs((double)(a[0]-a[2]))!=1)
{
if(fabs((double)(a[1]-a[4]))!=1&&fabs((double)(a[3]-a[1]))!=1)
{
if(fabs((double)(a[2]-a[3]))!=1&&fabs((double)(a[2]-a[5]))!=1&&fabs((double)(a[2]-a[6]))!=1)
{
if(fabs((double)(a[3]-a[4]))!=1&&fabs((double)(a[3]-a[6]))!=1&&fabs((double)(a[3]-a[7]))!=1&&fabs((double)(a[3]-a[5]))!=1)
{
if(fabs((double)(a[4]-a[6]))!=1&&fabs((double)(a[4]-a[7]))!=1)
{
if(fabs((double)(a[5]-a[6]))!=1&&fabs((double)(a[5]-a[8]))!=1&&fabs((double)(a[5]-a[9]))!=1)
{
if(fabs((double)(a[6]-a[7]))!=1&&fabs((double)(a[6]-a[9]))!=1&&fabs((double)(a[6]-a[8]))!=1)
{
if(fabs((double)(a[7]-a[9]))!=1)
{
if(fabs((double)(a[8]-a[9]))!=1)
sum++;
}
}
}
}
}
}
}
}
}while(next_permutation(a,a+10));//全排列的函数,两个参数为所需排列的数组首地址和末地址
cout<<sum;
return 0;
}


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: