- 浏览: 2041434 次
- 性别:
- 来自: 北京
-
文章分类
- 全部博客 (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 1331提供有偿 反编译 python2.5, python2.6 ... -
Python:封装允许执行命令有超时的类
2012-08-24 17:35 4543封装允许执行命令有超时的类 #!/usr/bin/env ... -
Python 多线程编程及同步处理
2011-06-17 13:04 3125综述 多线程是程序设计中的一个重要方面,尤其是 ... -
python 去掉重复行
2011-06-16 12:15 6915#!/usr/bin/env python impor ... -
通过python获取目录的大小
2011-06-07 11:04 8956通过python获取目录的大小 需要用到的mod ... -
python 单元测试示例2
2011-05-17 11:51 1576#!/usr/bin/env python ... -
python 单元测试示例1
2011-05-17 11:51 1758#!/usr/bin/env python im ... -
python 获取文件md5
2011-05-13 14:01 8053#!/usr/bin/env python im ... -
python模拟windows获取设置ini
2011-05-05 12:20 1155#!/usr/bin/env python from ... -
python 解析 json
2011-04-25 15:42 3714#!/usr/bin/env python impor ... -
python时间处理
2011-04-23 19:25 731import time; import os; impor ... -
python简单的socket 服务器和客户端
2011-03-03 17:42 11551服务器端代码 if "__main__&qu ... -
python __file__ 与argv[0]
2011-02-28 11:25 36905python __file__ 与argv[0] 在py ... -
python os.path模块 简明文档
2011-02-28 11:10 2108os.path.abspath(path)取path的绝对目录 ... -
Python 用HTMLParser解析HTML文件
2011-02-16 20:44 35015Python 用HTMLParser解析HTML文件 ... -
python使用simplejson解析示例
2011-02-16 15:28 8254#!/usr/bin/env python imp ... -
python simplejson模块的使用方法
2011-02-16 14:38 10334python安装:easy_install simplejso ... -
用PDB库调试Python程序
2011-01-06 12:54 1943如果使用过微软技术的朋友应该体会过微软的Visual Stud ... -
python更新svn
2010-12-29 11:05 6338def UpdateSvn(strUser, strPwd, ... -
python 函数参数的传递(参数带星号的说明)
2010-12-23 17:59 1463python中函数参数的传递是通过赋值来传递的。函数参数的 ...
相关推荐
在 Python 中解决旅行商问题的模拟退火算法 使用模拟退火元启发式求解旅行商问题,并将结果可视化。 首先使用贪心算法(最近邻)来构建初始解决方案。 一个简单的实现,提供了不错的结果。 在具有 100 个节点的 ...
Python 解决图片不能被一同打包到可执行文件中的问题 Python源码Python 解决图片不能被一同打包到可执行文件中的问题 Python源码Python 解决图片不能被一同打包到可执行文件中的问题 Python源码Python 解决图片不能...
Python 解决pandas.to_excel()函数覆盖原有Sheet页的问题 Python源码Python 解决pandas.to_excel()函数覆盖原有Sheet页的问题 Python源码Python 解决pandas.to_excel()函数覆盖原有Sheet页的问题 Python源码Python ...
在TSP中,计算城市之间的距离通常是解决问题的第一步。在提供的代码中,使用了Haversine公式来计算地球上两点之间的大圆距离,这是一种考虑地球曲率的计算方法。Haversine公式涉及将经纬度转换为弧度,然后应用三角...
Python 解决打包后不能获取当前项目路径的问题 Python源码Python 解决打包后不能获取当前项目路径的问题 Python源码Python 解决打包后不能获取当前项目路径的问题 Python源码Python 解决打包后不能获取当前项目路径...
【标题】:“解决容量车辆路径问题的 python 解决方案_CVRP_python_代码_下载”指的是一种使用Python编程语言解决车辆路线问题( Capacitated Vehicle Routing Problem, CVRP)的方法。CVRP是物流和运营研究领域的一...
Python 解决调用Word2007时出现“尚未调用Colnitialize”错误 Python源码Python 解决调用Word2007时出现“尚未调用Colnitialize”错误 Python源码Python 解决调用Word2007时出现“尚未调用Colnitialize”错误 Python...
Python 解决由于未安装模块而导致的 ”No module named ”问题 Python源码Python 解决由于未安装模块而导致的 ”No module named ”问题 Python源码Python 解决由于未安装模块而导致的 ”No module named ”问题 ...
python大作业股票量化回测源代码股票量化回测Python解决方案(高分项目).zip,本资源中的源码都是经过本地编译过可运行的,评审分达到98分,资源项目的难度比较适中,内容都是经过助教老师审定过的能够满足学习、...
python解决背包 问题算法课程作业
通过Python实现Hopfield网络解决TSP问题,不仅有助于理解神经网络的工作原理,还可以为实际问题提供一种有效的近似求解方法。同时,这也是一种将复杂问题转化为可操作的代码的好例子,展示了Python在科学计算和数据...
Python 解决将多个PDF文档合并为一个PDF文档时出现的编码问题 Python源码Python 解决将多个PDF文档合并为一个PDF文档时出现的编码问题 Python源码Python 解决将多个PDF文档合并为一个PDF文档时出现的编码问题 Python...
python入门奶牛问题python入门奶牛问题python入门奶牛问题python入门奶牛问题python入门奶牛问题python入门奶牛问题python入门奶牛问题python入门奶牛问题python入门奶牛问题python入门奶牛问题python入门奶牛问题...
其中,回溯法是一种试探性的解决问题的方法,当遇到矛盾时,会撤销最近的选择,尝试其他路径。而深度优先搜索(DFS)和迭代加深搜索(IDS)通常与回溯法结合使用,有效地探索解决方案空间。约束传播算法如AC-3算法,...
需要注意的是,这种方法只是暂时解决问题,并不是根本解决之道,因为这样做可能会导致其他依赖于Python 3的应用出现问题。 ```bash sudo ln -sf /usr/bin/python2.7 /usr/bin/python ``` 3. **更改解释器设置**...
Interactive 3D Rotating Cube with Numbered Faces
python解决旅行商(TSP)问题.zippython解决旅行商(TSP)问题.zippython解决旅行商(TSP)问题.zippython解决旅行商(TSP)问题.zippython解决旅行商(TSP)问题.zippython解决旅行商(TSP)问题.zippython解决旅行商(TSP)问题....
Python 解决直接访问请求地址返回403错误的问题 Python源码Python 解决直接访问请求地址返回403错误的问题 Python源码Python 解决直接访问请求地址返回403错误的问题 Python源码Python 解决直接访问请求地址返回403...
旅行商问题(英语:Travelling salesman problem, TSP)是组合优化中的一个NP困难问题,在运筹学和理论电脑科学中非常重要。...该资源通过python 建立旅行商问题的解法,效果良好,具有高拓展高利用的特性。