蓝桥杯 方格填数(全排列+图形补齐)

方格填数

如下的10个格子

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

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

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

 

解题思路:由题可知,题中的序列是固定的,只有0-9这10个元素,所以可以枚举其全部全排列,对每个排列根据条件进行筛选。

 

先看一个错误答案:520   

(图一)

一开始想当然的把0-9存入了一维数组中,如图一,然后发现下标i的上下两个相邻位置的坐标为i-4,i+4, 左右为i-1,i+1,

左上右下为i-5,i+5,右上左下为i-3,i+3。于是有了下面的错误代码。

错误代码:      (此错误代码运行结果为520)

 1 #include <iostream>
 2 #include <vector>
 3 #include <algorithm>
 4 
 5 using namespace std;
 6 
 7 vector<int>v;
 8 int a[8] = { -1,1,-3,3,-4,4,-5,5 };     //一维数组相邻点的下标
 9 
10 bool judge()
11 {
12     for (int i = 0; i <= 9; ++i)
13     {
14         for (int j = 0; j < 8; ++j)
15         {
16             int k = i + a[j];
17             if (k >= 0 && k <= 9)
18             {
19                 if (abs(v[k] - v[i]) == 1)  //相邻元素之差的绝对值为1
20                     return false;
21             }
22         }
23     }
24     return true;
25 }
26 
27 int main()
28 {
29     int cnt = 0;
30     for (int i = 0; i <= 9; ++i)
31         v.push_back(i);
32 
33     do
34     {
35         if (judge() == true)
36             cnt++;
37 
38     } while (next_permutation(v.begin(), v.end()));
39 
40     cout << cnt << endl;
41 
42     return 0;
43 }

 

错因: 忽略了边界上的坐标,比如7,一直认为左上就是i-5, 但是7-5=2, 但是7并没有左上方的点。

 

改进: 由于边界上的坐标比较难处理,所以为了消除边界的影响,将地图补全为如下规则图形,如图二,这样就消除了图二中红色区域边界上的影响:

(图二)

用大小为30的一维数组v保存。 

用一维数组vec保存0-9,对vec进行枚举全排列,然后将vec[0...9]分别赋值给图二中的红色区域,再将非红色的区域赋值为-10,

对于图二中的红色区域,发现下标i的上下两个相邻位置的坐标为i-6,i+6, 左右为i-1,i+1,左上右下为i-7,i+7,右上左下为i-5,i+5。

此时再用根据下标获取其相邻元素的值,判断填入的数字是否相邻即可。

 

改进后的正确代码:

 

 1 #include <iostream>  
 2 #include <vector>  
 3 #include <algorithm>  
 4 
 5 using namespace std;
 6 
 7 vector<int> v;    //补全的图形
 8 vector<int> vec;  //未补全的图形
 9 int a[8] = { -1,1,-5,5,-6,6,-7,7 };    //一维数组相邻点的下标
10 
11 bool judge(vector<int> v)
12 {
13     for (int i = 8; i <= 21; ++i)
14     {
15         for (int j = 0; j < 8; ++j)    //对其所有相邻位置进行枚举
16         {
17             int k = i + a[j];
18             if (abs(v[k] - v[i]) == 1)  //相邻元素之差的绝对值为1
19                 return false;
20             
21         }
22     }
23     return true;
24 }
25 
26 int main()
27 {
28     int cnt = 0;    //方案数
29     for (int i = 0; i <= 9; ++i)
30         vec.push_back(i);    //一开始必须升序,是为了保证next_permutation能枚举所有情况的排列
31 
32     for (int i = 0; i <= 29; ++i)
33         v.push_back(-10);
34 
35     do
36     {
37         v[8] = vec[0]; v[9] = vec[1]; v[10] = vec[2]; v[13] = vec[3]; v[14] = vec[4];
38         v[15] = vec[5]; v[16] = vec[6]; v[19] = vec[7]; v[20] = vec[8]; v[21] = vec[9];
39 
40         if (judge(v) == true)
41             cnt++;
42 
43     } while (next_permutation(vec.begin(), vec.end()));
44     
45     cout << cnt << endl;
46 
47     return 0;
48 }

 

正确结果:1580

转载于:https://www.cnblogs.com/FengZeng666/p/10547864.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/387230.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

操作系统03进程管理Process_Scheduling

2 Process Scheduling >Type of scheduling >Scheduling Criteria (准则) >Scheduling Algorithm >Real-Time Scheduling (嵌入式系统) 2.1 Learning Objectives By the end of this lecture you should be able to Explain what is Response Time 响应时间-…

skimage库需要依赖 numpy+mkl 和scipy

skimage库需要依赖 numpymkl 和scipy1、打开运行&#xff0c;输入cmd回车&#xff0c;输入python回车&#xff0c;查看python版本2、在https://www.lfd.uci.edu/~gohlke/pythonlibs/#numpy 中&#xff0c;根据自己python版本下载需要的包 &#xff08;因为我的是python 2.7.13 …

操作系统04进程同步与通信

4.1 进程间的相互作用 4.1.1 进程间的联系资源共享关系相互合作关系临界资源应互斥访问。临界区&#xff1a;不论是硬件临界资源&#xff0c;还是软件临界资源&#xff0c;多个进程必须互斥地对它们进行访问。把在每个进程中访问临界资源的那段代码称为临界资源区。显然&#x…

oracle迁移到greenplum的方案

oracle数据库是一种关系型数据库管理系统&#xff0c;在数据库领域一直处于领先的地位&#xff0c;适合于大型项目的开发&#xff1b;银行、电信、电商、金融等各领域都大量使用Oracle数据库。 greenplum是一款开源的分布式数据库存储解决方案&#xff0c;主要关注数据仓库和BI…

CNN框架的搭建及各个参数的调节

本文代码下载地址&#xff1a;我的github本文主要讲解将CNN应用于人脸识别的流程&#xff0c;程序基于PythonnumpytheanoPIL开发&#xff0c;采用类似LeNet5的CNN模型&#xff0c;应用于olivettifaces人脸数据库&#xff0c;实现人脸识别的功能&#xff0c;模型的误差降到了5%以…

操作系统05死锁

进程管理4--Deadlock and Starvation Concurrency: Deadlock and Starvation 内容提要 >产生死锁与饥饿的原因 >解决死锁的方法 >死锁/同步的经典问题&#xff1a;哲学家进餐问题 Deadlock 系统的一种随机性错误 Permanent blocking of a set of processes that eith…

CNN tensorflow 人脸识别

数据材料这是一个小型的人脸数据库&#xff0c;一共有40个人&#xff0c;每个人有10张照片作为样本数据。这些图片都是黑白照片&#xff0c;意味着这些图片都只有灰度0-255&#xff0c;没有rgb三通道。于是我们需要对这张大图片切分成一个个的小脸。整张图片大小是1190 942&am…

数据结构01绪论

第一章绪论 1.1 什么是数据结构 数据结构是一门研究非数值计算的程序设计问题中&#xff0c;计算机的操作对象以及他们之间的关系和操作的学科。 面向过程程序数据结构算法 数据结构是介于数学、计算机硬件、计算机软件三者之间的一门核心课程。 数据结构是程序设计、编译…

css3动画、2D与3D效果

1.兼容性 css3针对同一样式在不同浏览器的兼容 需要在样式属性前加上内核前缀&#xff1b; 谷歌&#xff08;chrome&#xff09; -webkit-transition: Opera&#xff08;欧鹏&#xff09; -o-transition: Firefox&#xff08;火狐&#xff09; -moz-transition Ie -ms-tr…

数据结构02线性表

第二章 线性表 C中STL顺序表&#xff1a;vector http://blog.csdn.net/weixin_37289816/article/details/54710677链表&#xff1a;list http://blog.csdn.net/weixin_37289816/article/details/54773406在数据元素的非空有限集中&#xff1a; (1)存在唯一一个被称作“第…

训练一个神经网络 能让她认得我

写个神经网络&#xff0c;让她认得我(๑•ᴗ•๑)(Tensorflow,opencv,dlib,cnn,人脸识别) 这段时间正在学习tensorflow的卷积神经网络部分&#xff0c;为了对卷积神经网络能够有一个更深的了解&#xff0c;自己动手实现一个例程是比较好的方式&#xff0c;所以就选了一个这样比…

数据结构03栈和队列

第三章栈和队列 STL栈&#xff1a;stack http://blog.csdn.net/weixin_37289816/article/details/54773495队列&#xff1a;queue http://blog.csdn.net/weixin_37289816/article/details/54773581priority_queue http://blog.csdn.net/weixin_37289816/article/details/5477…

树莓派pwm驱动好盈电调及伺服电机

本文讲述如何通过树莓派的硬件PWM控制好盈电调来驱动RC车子的前进后退&#xff0c;以及如何驱动伺服电机来控制车子转向。 1. 好盈电调简介 车子上的电调型号为&#xff1a;WP-10BLS-A-RTR&#xff0c;在好盈官网并没有搜到对应手册&#xff0c;但找到一份通用RC竞速车的电调使…

数据结构04串

第四章 串 STL&#xff1a;string http://blog.csdn.net/weixin_37289816/article/details/54716009计算机上非数值处理的对象基本上是字符串数据。 在不同类型的应用中&#xff0c;字符串具有不同的特点&#xff0c;要有效的实现字符串的处理&#xff0c;必须选用合适的存储…

CAS单点登录原理解析

CAS单点登录原理解析 SSO英文全称Single Sign On&#xff0c;单点登录。SSO是在多个应用系统中&#xff0c;用户只需要登录一次就可以访问所有相互信任的应用系统。CAS是一种基于http协议的B/S应用系统单点登录实现方案&#xff0c;认识CAS之前首先要熟悉http协议、Session与Co…

数据结构05数组和广义表

第五章 数组 和 广义表 数组和广义表可以看成是线性表在下述含义上的扩展&#xff1a;表中的数据元素本身也是一个数据结构。 5.1 数组的定义 n维数组中每个元素都受着n个关系的约束&#xff0c;每个元素都有一个直接后继元素。 可以把二维数组看成是这样一个定长线性表&…

数据结构06树和二叉树

第六章 树和二叉树 6.1 树的定义和基本术语 树 Tree 是n个结点的有限集。 任意一棵非空树中&#xff1a; &#xff08;1&#xff09;有且仅有一个特定的称为根&#xff08;root&#xff09;的结点&#xff1b; &#xff08;2&#xff09;当n>1时&#xff0c;其余结点可…

CountDownLatch,CyclicBarrier和Semaphore

在java 1.5中&#xff0c;提供了一些非常有用的辅助类来帮助我们进行并发编程&#xff0c;比如CountDownLatch&#xff0c;CyclicBarrier和Semaphore&#xff0c;今天我们就来学习一下这三个辅助类的用法。以下是本文目录大纲&#xff1a;一.CountDownLatch用法二.CyclicBarrie…

数据结构07排序

第十章内部排序 10.1 概述 排序就是把一组数据按关键字的大小有规律地排列。经过排序的数据更易于查找。 排序前KiKj&#xff0c;且Ki在前: 排序方法是稳定的&#xff0c;若排序后Ki在前&#xff1b; 排序方法是不稳定的&#xff0c;如排序后Kj在前。 分类&#xff1a; 内…

数据结构08查找

第九章 查找 另一种在实际应用中大量使用的数据结构--查找表。 所谓查找&#xff0c;即为在一个含有众多的数据元素的查找表中找出某个“特定的”数据元素。 查找表 search table 是由同一类型的数据元素构成的集合。集合中的数据元素之间存在着完全松散的关系&#xff0c;故…