【原创】素数环问题求解探讨
2007-11-30 23:59
357 查看
原创于11.30日午夜。
问题描述:
素数环问题。
有一个环是由n个圆圈组成(n为偶数),我们想把1到n之间的n个自然数放在这些空的圆圈中,使得相邻两个圆圈的数之和为一素数。注意第一个圆圈的数一定是1,下面以n=6实例:
0 && image.height>0){if(image.width>=700){this.width=700;this.height=image.height*700/image.width;}}" width="510" height="379" border="0" class="blogimg" small="0" src="http://hiphotos.baidu.com/absolute8511/pic/item/2ae983197f82954842a9ad74.jpg" />
输入说明:0<n<=16
输出说明:输出的每一列就是圆圈中的数字,从1开始顺时针方向旋转。输出要求必须满足以上要求。
输入用例:
6
8
输出用例:
Case 1:
1 4 3 2 5 6
1 6 5 2 3 4
Case 2:
1 2 3 8 5 6 7 4
1 2 5 8 3 4 7 6
1 4 7 6 5 8 3 2
1 6 7 4 3 8 5 2
解决方案详述:
素数环算法原理图如下:
0 && image.height>0){if(image.width>=700){this.width=700;this.height=image.height*700/image.width;}}" border="0" src="http://photo15.yupoo.com/20071130/232400_518629138.jpg" />
以4个数为例。首先第一个为1,接下来从其他未选过的值中按从小到大选取下个节点值,选好后判断它和上个节点的和是否为素数,如果不为素数则此节点选取下个值,如果是素数则走向下个节点。
本例中则第二节点为2,1+2为素数,所以走向第三个节点,再遵循前面的规则,选第三节点值为3,2+3为素数,走向节点4,前面没有选的值只有4,因此
选取4作为节点4的值,3+4为素数,当遇到最后一个节点时还要判断它和第一个节点的和是否为素数,由于4+1为素数且已经达到最后节点,因此输出此次循
环的最终值:1,2,3,4.
然后开始回溯。回到上个节点,对节点取另一个值(由小到大且不和原先选过的重复),然后继续按照前述规则判断。
本例中,回到第三节点,上次选取值为3,比它大且按顺序没选过的值为4,但2+4不是素数,且4是最后一个可选的数,因此不用继续下去了,开始回溯。回到
第二节点,选取节点值为3,但1+3不是素数,第二节点再次选取下一个值4,1+4为素数,走向下个节点第三节点,选其值为2,但2+4不为素数,第三节
点选取下个值3,3+4为素数,走向下个节点,第四节点,只有2可选,3+2为素数,由于到达末节点,输出所有节点值:1,4,3,2.
然后再回溯到第三节点,由于已无值可选,在回溯到第二节点,也是无值可选,于是回溯到第一节点,由于到达顶节点,过程结束。
此算法最坏时间复杂度为 (N-1)!,由于复杂度很大,所以此算法还有待改进。有待大家一起来找到更优化的算法。谢谢!
源代码:
问题描述:
素数环问题。
有一个环是由n个圆圈组成(n为偶数),我们想把1到n之间的n个自然数放在这些空的圆圈中,使得相邻两个圆圈的数之和为一素数。注意第一个圆圈的数一定是1,下面以n=6实例:
0 && image.height>0){if(image.width>=700){this.width=700;this.height=image.height*700/image.width;}}" width="510" height="379" border="0" class="blogimg" small="0" src="http://hiphotos.baidu.com/absolute8511/pic/item/2ae983197f82954842a9ad74.jpg" />
输入说明:0<n<=16
输出说明:输出的每一列就是圆圈中的数字,从1开始顺时针方向旋转。输出要求必须满足以上要求。
输入用例:
6
8
输出用例:
Case 1:
1 4 3 2 5 6
1 6 5 2 3 4
Case 2:
1 2 3 8 5 6 7 4
1 2 5 8 3 4 7 6
1 4 7 6 5 8 3 2
1 6 7 4 3 8 5 2
解决方案详述:
素数环算法原理图如下:
0 && image.height>0){if(image.width>=700){this.width=700;this.height=image.height*700/image.width;}}" border="0" src="http://photo15.yupoo.com/20071130/232400_518629138.jpg" />
以4个数为例。首先第一个为1,接下来从其他未选过的值中按从小到大选取下个节点值,选好后判断它和上个节点的和是否为素数,如果不为素数则此节点选取下个值,如果是素数则走向下个节点。
本例中则第二节点为2,1+2为素数,所以走向第三个节点,再遵循前面的规则,选第三节点值为3,2+3为素数,走向节点4,前面没有选的值只有4,因此
选取4作为节点4的值,3+4为素数,当遇到最后一个节点时还要判断它和第一个节点的和是否为素数,由于4+1为素数且已经达到最后节点,因此输出此次循
环的最终值:1,2,3,4.
然后开始回溯。回到上个节点,对节点取另一个值(由小到大且不和原先选过的重复),然后继续按照前述规则判断。
本例中,回到第三节点,上次选取值为3,比它大且按顺序没选过的值为4,但2+4不是素数,且4是最后一个可选的数,因此不用继续下去了,开始回溯。回到
第二节点,选取节点值为3,但1+3不是素数,第二节点再次选取下一个值4,1+4为素数,走向下个节点第三节点,选其值为2,但2+4不为素数,第三节
点选取下个值3,3+4为素数,走向下个节点,第四节点,只有2可选,3+2为素数,由于到达末节点,输出所有节点值:1,4,3,2.
然后再回溯到第三节点,由于已无值可选,在回溯到第二节点,也是无值可选,于是回溯到第一节点,由于到达顶节点,过程结束。
此算法最坏时间复杂度为 (N-1)!,由于复杂度很大,所以此算法还有待改进。有待大家一起来找到更优化的算法。谢谢!
源代码:
|
相关文章推荐
- [原创] 软件外包(对日)常见问题探讨
- 算法:求解,两个合适的整数间素数个数的问题
- 高可用方案之脑裂问题探讨(原创)
- 三分法——求解凸性函数的极值问题——czyuan原创
- 素数问题(Prime number problem)的求解 ---- C 语言学习
- 39节 问题求解——求素数 课后
- 求解素数问题
- C语言初步-第39讲:问题求解——求素数(练习综合)
- 第四周《C语言及程序设计》实践项目39 问题求解——求素数
- 三分法——求解凸性函数的极值问题——czyuan原创
- 三分法——求解凸性函数的极值问题——czyuan原创
- 求解素数问题
- 三分法——求解凸性函数的极值问题——czyuan原创
- 第39课 问题求解——求素数 【数字游戏 项目1-6】
- [原创]【动态规划求解“键盘上字母分配”问题】
- 学习笔记——求解素数问题之Eratosthenes(埃拉托色尼)筛选法
- [原创]探讨多个QRadioButtons的AutoExclusive的问题
- 字符串是否包含问题利用素数求解
- 素数求解问题及优化
- 高可用方案之脑裂问题探讨(原创)