腾讯 2015秋招笔试题 编程题2:九宫格填数
来源:互联网 发布:淘宝客服的培训资料 编辑:程序博客网 时间:2024/06/11 18:24
腾讯 2015秋招笔试题 编程2:九宫格填数
题目 2: 有下图的题解,请用 C/C++ 代码来列出满足下图 0-100 内的所有答案。
九宫格横竖都等于4.
智力冲浪 数字推理
请将八个数字填入方格中,在数字不允许重复的情况下,使横行和竖行的答案都等于4,你能填出来吗?
横向满足:
□+□-9=4,
□-□*□=4
□+□-□=4
另外纵向还满足其他条件,具体见下图:
分析:
用a1~a9表示九个数,其中a3=9,根据图中的信息,可以列出如下六个方程,
a1+a2-9=4 (1)
a4-a5*a6=4 (2)
a7+a8-a9=4 (3)
a1+a4/a7=4 (4)
a2-a5*a8=4 (5)
9-a6-a9=4 (6)
6个方程8个未知数,自然解不出来的,所以如果在确定2个,则另外6个就可以算出来了,那么确定那两个呢?分析上面六个式子,由方程(4)则a1<=4范围一下缩小了很多
另外由(6)a6+a9=5,则a6<=5,a9<=5;那么a6是否是另一个要确定的数呢?假设是,我们继续往下算,这样0=<a1<=4,0=<a6<=5,a2、a9很容易的由a1、a6表示,但是求其他数
的时候,我发现有a4/a7,a5*a8两项,则其结果必然是两次方程,求解比较麻烦,所以a6不能是另一个要确定的数了。二次项产生的根源是a4/a7,a5*a8所以,所以避免求解二次方程
要确定a4、a5、a7、a8中的一个又(3)式a7+a8=4+a9<=9,则a7<=9,a8<=9;
所以取固定a1,a7;则分别求得各项如下:
a2=13-a1;
a4=(4-a1)*a7;
a8=(a2-4)*(9-a7)/(a2+a4-8);
a6=9-a7-a8;
a9=5-a6;
a5=(a2-4)/a8;
若求得的某一个值不在0-100的范围内,则此时的a1,a7不满足要求,这样只需两层循环即可;
两一个重要的问题是题中未说明a1-a9是整数,所以题目应该是有无数个解得;
设a1,a7未整数,则可以算得共有27组解,其中一组全部是整数。
时间复杂度较高的算法 代码:
#include<stdio.h>#include<set>using namespace std;int main() {double a[10];a[3] = 9;set<double> c;// 判断重复int count=0;for(int i = 0; i <= 100; i++) {for(int j = 0; j <= 100; j++) {c.clear();c.insert(a[3]);a[1] = i;if(c.find(a[1]) != c.end()) {continue;}c.insert(a[1]);// 判断重复a[7] = j;if(c.find(a[7]) != c.end()) {continue;}c.insert(a[7]);// 判断重复a[2] = 13 - a[1];if(a[2] < 0) {continue;}if(c.find(a[2]) != c.end()) {continue;}c.insert(a[2]);// 判断重复+小于0a[4] = (4 - a[1])*a[7];if(a[4] < 0) {continue;}if(c.find(a[4]) != c.end()) {continue;}c.insert(a[4]);// 判断重复+小于0if(a[2] + a[4] == 8) {continue; // 判断除0}a[8] = (a[2] - 4)*(9 - a[7])/(a[2] + a[4] - 8);if(a[8] < 0) {continue;}if(c.find(a[8]) != c.end()) {continue;}c.insert(a[8]);// 判断重复+小于0a[6] = 9 - a[7] - a[8];if(a[6] < 0) {continue;}if(c.find(a[6]) != c.end()) {continue;}c.insert(a[6]);// 判断重复+小于0a[9] = 5 - a[6];if(a[9] < 0) {continue;}if(c.find(a[9]) != c.end()) {continue;}c.insert(a[9]);// 判断重复+小于0if(a[8] == 0) {continue; // 判断除0}a[5] = (a[2] - 4) / a[8];if(a[5] < 0) {continue;}if(c.find(a[5]) != c.end()) {continue;}c.insert(a[5]);// 判断重复+小于0for(int k = 1; k <= 9; k++) {printf("%f ", a[k]);}count++;printf("\n");}}printf("Total: %d\n",count);return 0;}
总结: 若全部是整数则只有一组解, 否则有无数组解, 与所取的精度有关.
参考:
[16腾讯在线笔试题2]-填数字 - CiaoLiang的专栏 -CSDN博客 http://blog.csdn.net/ciaoliang/article/details/48253749
Java版 参考: http://blog.csdn.net/u010660138/article/details/48266297
- 腾讯 2015秋招笔试题 编程题2:九宫格填数
- 腾讯2016秋招笔试编程题
- 腾讯2017秋招笔试编程题
- 腾讯2017秋招笔试编程题
- 腾讯2017秋招笔试编程题
- 腾讯2017秋招编程笔试题
- 腾讯2017秋招笔试编程题
- 腾讯2017秋招笔试编程题
- 腾讯2017秋招笔试编程题--编码
- 腾讯2017秋招笔试编程题--游戏任务标记
- 腾讯2017秋招笔试编程题--素数对
- 腾讯2017秋招笔试编程题--geohash编码
- 腾讯2017秋招笔试编程题_编码
- 腾讯2017秋招笔试编程题之素数
- 腾讯2017秋招笔试[编程题] 素数对
- 腾讯2017秋招笔试[编程题] geohash编码
- 腾讯2017秋招笔试编程题(一)
- 腾讯2017秋招笔试编程题:编码 [python]
- final与static final的区别
- 删除排序数组中的重复数字
- gcc优化选项
- Apache Thrift的简单使用
- 【语言-Python】Turtle Screen简单消息处理
- 腾讯 2015秋招笔试题 编程题2:九宫格填数
- 欢迎使用CSDN-markdown编辑器
- mysql导入sql文件过大或连接超时的解决办法
- RxAndroid使用指南
- 你可能不知道的陷阱:C#委托和事件的困惑
- protege出现虚拟机载入错误的解决办法
- laravel No supported encrypter found. The cipher and / or key length are invalid.
- Android 开发 NDK从入门到精通
- 论文提要“Training Region-based Object Detectors with Online Hard Example Mining”