- 浏览: 2031137 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (651)
- ACE (35)
- BAT (9)
- C/C++ (116)
- fast-cgi (14)
- COM (27)
- python (59)
- CGI (4)
- C# (2)
- VC (84)
- DataBase (29)
- Linux (96)
- P2P (6)
- PHP (15)
- Web (6)
- Memcached (7)
- IME输入法 (11)
- 设计模式 (2)
- 搜索引擎 (1)
- 个人情感 (4)
- 笔试/面试 (3)
- 一亩三分地 (33)
- 历史 (2)
- 地理 (1)
- 人物 (3)
- 经济 (0)
- 不仅仅是笑哦 (43)
- 小故事大道理 (2)
- http://www.bjdsmyysjk120.com/ (0)
- http://www.bjdsmyy120.com/ (0)
- 它山之石可以攻玉 (15)
- 大学生你关注些什么 (28)
- 数据恢复 (1)
最新评论
-
luokaichuang:
这个规范里还是没有让我明白当浏览器上传文件时,STDIN的消息 ...
FastCGI规范 -
effort_fan:
好文章!学习了,谢谢分享!
com技术简介 -
vcell:
有错误os.walk(strPath)返回的已经是全部的文件和 ...
通过python获取目录的大小 -
feifeigd:
feifeigd 写道注意:文章中的CPP示例第二行 #inc ...
ATL入门:利用ATL编写简单的COM组件 -
feifeigd:
注意:文章中的CPP示例第二行 #include " ...
ATL入门:利用ATL编写简单的COM组件
用Python解决立方体的摆放问题
近日编程解决了某人发在shlug上的一道面试题,当时的几条讨论的在这里:https://groups.google.com/group/shlug/browse_thread/thread/6fbdd7efa63b6d7a
下面是我对该问题的整理和实现的代码
------------------
问题:
有4个彩色的立方体。立方体的6个面,每面都涂上了1种颜色。一共有4种颜色,蓝色(B),红色(R),绿色(G)和黄色(Y)。立方体的6个面称为前(front)、后(back)、左(left)、右(right)、上(top)、下(bottom)。
这4个立方体的颜色排列为:
编号 front back left right top bottom
1 R B G Y B Y
2 R G G Y B B
3 Y B R G Y R
4 Y G B R R R
请将这4个立方体重叠摆放成为一个立柱,这个立柱有4个侧面,要求每个侧面都有4种颜色。
用你最拿手的语言编程实现,算出有多少种摆放方式。
------------------
初始的想法:
1. 考虑单个立方体的摆放方法,有6个面,也就是6种情况;将每种情况下的4个侧面的颜色保存到一个数组中,得到一个6X4的数组 a[6][4]; 此外,每种摆放方法还可以旋转4次
2. 不考虑颜色,只考虑立方体的重叠方式,一共有24种方法。
3. 针对24种情况中的每一种,从每一个立方体里分别取一个数组元素,比较之,一旦有相同的就失败,否则count+1;用回溯法解决。
4. 最终的count就是总共的可能性。
复杂度:24 * (6*4) * (6*4) * (6*4) * (6*4) = 7962624; 其中的6*4是指立方体有6种摆放方法,而每种还可以旋转4次 但是由于一旦失败就会提前退出循环,所以实际次数很远远小于上面的数字。
感觉算法不难,但是第一步的保存颜色到数组的过程绝对是一件容易出错的体力活
------------------
然而,在编码的过程中,发现完全可以更简单一些,如下为简化之处:
因为颜色与方块的位置无关,所以只要考虑一种组合即可
而最下面的方块的四种旋转方式其实是一样的,确定一种,旋转4次,即为4倍
所以如果在 "方块1,2,3,4顺便摆放,而且方块1不旋转" 的前提下有N种方法,
那么一共就有 4 * 4!* N = 96N 种方法
用Python编程解决了一下,发现 "方块1,2,3,4顺便摆放,而且方块1不旋转" 的情况下只有2种摆放方式
为:
('R', 'Y', 'B', 'B')
('G', 'G', 'R', 'Y')
('B', 'R', 'Y', 'G')
('Y', 'B', 'G', 'R')
和:
('R', 'B', 'B', 'Y')
('G', 'Y', 'R', 'G')
('B', 'G', 'Y', 'R')
('Y', 'R', 'G', 'B')
而最终循环的次数也只有145次。
---------------------------
下面为实现的Python代码 (老规矩,前面添加'- '来保留前置空格 -- 可恶的blog格式):
- #!/usr/bin/python
-
- # Chunis Deng @ 2010.05.12 (chunchengfh@gmail.com)
-
- def accumulate(level):
- #print_result(level) # uncomment this to get debug info
-
- if level == 0:
- for i in range(6):
- flags[0] = [i, 0]
- accumulate(level+1)
- else:
- for x in range(6):
- for y in range(4):
- flags[level] = [x, y]
- result = is_current_OK(level)
- if result: # all sides with different colors
- if level == LEVEL:
- print "OK, Result is: "
- print_result(level)
- else:
- accumulate(level+1)
-
- def print_result(lvl):
- print "Level: ", lvl+1
- for i in range(lvl+1):
- print flags[i]
- for i in range(lvl+1):
- (x, y) = flags[i]
- sqr = sqr_array[i]
- print sqr[x][y:] + sqr[x][:y]
- print # just print a blank line
-
- def is_current_OK(lvl):
- tmp_lst = []
- for i in range(lvl+1):
- (x, y) = flags[i]
- sqr = sqr_array[i]
- tmp_lst.append(sqr[x][y:] + sqr[x][:y])
-
- for i in range(4):
- mylist = []
- for j in range(lvl):
- mylist.append(tmp_lst[j][i])
- if tmp_lst[lvl][i] in mylist:
- return 0
-
- return 1
-
-
- LEVEL = 3 # count from 0
- flags = [
- [0, 0],
- [0, 0],
- [0, 0],
- [0, 0] ]
-
- sqr_color = ( ( 1, 'R', 'B', 'G', 'Y', 'B', 'Y' ),
- ( 2, 'R', 'G', 'G', 'Y', 'B', 'B' ),
- ( 3, 'Y', 'B', 'R', 'G', 'Y', 'R' ),
- ( 4, 'Y', 'G', 'B', 'R', 'R', 'R' ) )
-
- sqr_array = []
-
-
- # i: put_as_bottom: sides: sides_index:
- # -------------------------------------------------
- # a) front: edfc 5463
- # b) back: fdec 6453
- # c) left: afbe 1625
- # d) right: aebf 1526
- # e) top: bdac 2413
- # f) bottom: adbc 1423
-
- for sqr in sqr_color:
- tmp = []
- tmp.append( (sqr[5], sqr[4], sqr[6], sqr[3]) ) # front
- tmp.append( (sqr[6], sqr[4], sqr[5], sqr[3]) ) # back
- tmp.append( (sqr[1], sqr[6], sqr[2], sqr[5]) ) # left
- tmp.append( (sqr[1], sqr[5], sqr[2], sqr[6]) ) # right
- tmp.append( (sqr[2], sqr[4], sqr[1], sqr[3]) ) # top
- tmp.append( (sqr[1], sqr[4], sqr[2], sqr[3]) ) # bottom
- sqr_array.append(tmp)
-
- #for x in sqr_array: print x # uncomment this to get debug info
- accumulate(0)
发表评论
-
提供有偿反编译 python2.5,2.6,2.7 code
2014-04-03 16:32 1322提供有偿 反编译 python2.5, python2.6 ... -
Python:封装允许执行命令有超时的类
2012-08-24 17:35 4530封装允许执行命令有超时的类 #!/usr/bin/env ... -
Python 多线程编程及同步处理
2011-06-17 13:04 3109综述 多线程是程序设计中的一个重要方面,尤其是 ... -
python 去掉重复行
2011-06-16 12:15 6899#!/usr/bin/env python impor ... -
通过python获取目录的大小
2011-06-07 11:04 8942通过python获取目录的大小 需要用到的mod ... -
python 单元测试示例2
2011-05-17 11:51 1562#!/usr/bin/env python ... -
python 单元测试示例1
2011-05-17 11:51 1750#!/usr/bin/env python im ... -
python 获取文件md5
2011-05-13 14:01 8031#!/usr/bin/env python im ... -
python模拟windows获取设置ini
2011-05-05 12:20 1139#!/usr/bin/env python from ... -
python 解析 json
2011-04-25 15:42 3693#!/usr/bin/env python impor ... -
python时间处理
2011-04-23 19:25 716import time; import os; impor ... -
python简单的socket 服务器和客户端
2011-03-03 17:42 11540服务器端代码 if "__main__&qu ... -
python __file__ 与argv[0]
2011-02-28 11:25 36876python __file__ 与argv[0] 在py ... -
python os.path模块 简明文档
2011-02-28 11:10 2095os.path.abspath(path)取path的绝对目录 ... -
Python 用HTMLParser解析HTML文件
2011-02-16 20:44 34991Python 用HTMLParser解析HTML文件 ... -
python使用simplejson解析示例
2011-02-16 15:28 8210#!/usr/bin/env python imp ... -
python simplejson模块的使用方法
2011-02-16 14:38 10323python安装:easy_install simplejso ... -
用PDB库调试Python程序
2011-01-06 12:54 1936如果使用过微软技术的朋友应该体会过微软的Visual Stud ... -
python更新svn
2010-12-29 11:05 6318def UpdateSvn(strUser, strPwd, ... -
python 函数参数的传递(参数带星号的说明)
2010-12-23 17:59 1452python中函数参数的传递是通过赋值来传递的。函数参数的 ...
相关推荐
在 Python 中解决旅行商问题的模拟退火算法 使用模拟退火元启发式求解旅行商问题,并将结果可视化。 首先使用贪心算法(最近邻)来构建初始解决方案。 一个简单的实现,提供了不错的结果。 在具有 100 个节点的 ...
Python 解决pandas.to_excel()函数覆盖原有Sheet页的问题 Python源码Python 解决pandas.to_excel()函数覆盖原有Sheet页的问题 Python源码Python 解决pandas.to_excel()函数覆盖原有Sheet页的问题 Python源码Python ...
Python 解决打包后不能获取当前项目路径的问题 Python源码Python 解决打包后不能获取当前项目路径的问题 Python源码Python 解决打包后不能获取当前项目路径的问题 Python源码Python 解决打包后不能获取当前项目路径...
【标题】:“解决容量车辆路径问题的 python 解决方案_CVRP_python_代码_下载”指的是一种使用Python编程语言解决车辆路线问题( Capacitated Vehicle Routing Problem, CVRP)的方法。CVRP是物流和运营研究领域的一...
Python 解决由于未安装模块而导致的 ”No module named ”问题 Python源码Python 解决由于未安装模块而导致的 ”No module named ”问题 Python源码Python 解决由于未安装模块而导致的 ”No module named ”问题 ...
计算机图形学
Python 解决表格显示数据时最后一列不自动适应容器大小的问题 Python源码Python 解决表格显示数据时最后一列不自动适应容器大小的问题 Python源码Python 解决表格显示数据时最后一列不自动适应容器大小的问题 Python...
python解决背包 问题算法课程作业
在介绍如何使用Python绘制立方体之前,先了解一些相关的知识点。 知识点一:VTK库的安装与导入 在Python中使用VTK,首先需要安装VTK库。可以通过pip安装: ```python pip install vtk ``` 安装完成后,在Python...
通过Python实现Hopfield网络解决TSP问题,不仅有助于理解神经网络的工作原理,还可以为实际问题提供一种有效的近似求解方法。同时,这也是一种将复杂问题转化为可操作的代码的好例子,展示了Python在科学计算和数据...
本篇文档将为大家详细介绍如何使用Python绘制一个基本的三维立方体,并通过实例分享具体的代码实现。 文档中首先介绍了使用Python进行三维图形绘制的基本思路,强调了使用VTK(Visualization Toolkit)这一功能强大...
解决python中文乱码问题、首先发送请求,然后将请求返回的值传到coding(req)函数。
本项目采用Python语言实现了遗传算法来解决3D bin packing问题。 首先,我们要了解遗传算法的基本原理。遗传算法受到生物进化过程的启发,包括选择、交叉和变异等操作。在解决3D bin packing问题时,每个个体代表一...
在"基于遗传算法的具有时间窗的车辆路径问题解决方案的Python实现"项目中,开发者使用Python编程语言来构建了一个GA模型,以求解VRPTW。以下是这个项目中的关键知识点: 1. 遗传算法:这是一种模拟生物进化过程的...
本手册主要是了解计算机科学、程序设计和问题解决的基本概念;理解什么是“抽象”以及抽象在问题解决过程中的作用;理解“抽象数据类型”的概念以及在实际操作中学会运用;学习Python程序设计语言。需要的朋友可下载...
Python代码+可视化:智能优化算法学习-粒子群算法(Particle Swarm Optimization, PSO)解决TSP问题
在标题中提到的“基于python+gurobi的数值双层规划问题求解”,意味着我们将使用Python作为编程语言,并利用Gurobi这个强大的优化求解器来解决双层规划问题。Gurobi是一个商业的数学优化软件,它能高效地处理线性...
算法课程实验、大作业
Python 解决对图片格式进行批量转换的问题 Python源码Python 解决对图片格式进行批量转换的问题 Python源码Python 解决对图片格式进行批量转换的问题 Python源码Python 解决对图片格式进行批量转换的问题 Python源码...
目录Python问题解决(一),重复向列表中添加字典作为元素向一个列表中添加字典作为元素时错误描述解决最后 Python问题解决(一),重复向列表中添加字典作为元素 其他python学习笔记集合: Python基础知识详解 从...