`
javayestome
  • 浏览: 1029135 次
  • 性别: Icon_minigender_2
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

8皇后问题的c++与python实现对比

阅读更多
c++经典书多,但貌似不太新,而python则新书很多,能体现一些新思路新概念。看python的书,写python代码,再用c++实现一遍,这样互补的学习方式貌似也蛮适合自己的。
在《Beginning Python From Novice to Professional》一书的八皇后问题上,python果然精妙而优雅。
在对待
  1. foreachpossibilityatlevel1:
  2. foreachpossibilityatlevel2:
  3. foreachpossibilityatleveln:
  4. ...
  5. isitviable
形式的循环下,它有yield, generator递归。短短20来行代码就搞定了八皇后,如下:
  1. defconflict(state,nextX):
  2. nextY=len(state)
  3. ifnextY==0:print0
  4. foriinrange(nextY):
  5. ifabs(nextX-state[i])in(0,nextY-i):
  6. returnTrue
  7. returnFalse
  8. defqueen(num,state=()):
  9. printstate
  10. forposinrange(num):
  11. ifnotconflict(state,pos):
  12. iflen(state)==num-1:
  13. yield(pos,)
  14. else:
  15. forresultinqueen(num,state+(pos,)):
  16. yield(pos,)+result
  17. defprettyprint(solution):
  18. defline(pos,length=len(solution)):
  19. return'.'*pos+'X'+'.'*(length-pos-1)
  20. forposinsolution:
  21. printline(pos)
  22. if__name__=='__main__':
  23. importrandom
  24. prettyprint(random.choice(list(queen(4))))
其中
  1. forresultinqueen(num,state+(pos,)):
  2. yield(pos,)+result
2句由为精妙,自己苦思很久,没有能完全理解yield的精髓。。。。。

在用c++实现的时候,一直想模仿实现这句话的功能,却被这句话困扰了2个多小时,看书看久了不休息果然效率奇差。
今天早上醒来,才恍然大悟,其实不就是个栈么。
  1. /*
  2. *=====================================================================================
  3. *
  4. *Filename:eightqueen.cpp
  5. *
  6. *Description:8皇后问题,c++实现
  7. *
  8. *Version:1.0
  9. *Created:2008年12月30日19时46分52秒
  10. *Revision:none
  11. *Compiler:gcc
  12. *
  13. *Author:LiWeiJian(mn),lwj1396@163.com
  14. *Company:hunanuniversity
  15. *
  16. *=====================================================================================
  17. */
  18. #include<vector>
  19. #include<iostream>
  20. #include<cmath>
  21. usingnamespacestd;
  22. boolconflict(constvector<int>&state,intnextX)
  23. {
  24. intnextY=state.size();
  25. for(inti=0;i<nextY;i++)
  26. {
  27. if(abs(nextX-state[i])==0||abs(nextX-state[i])==(nextY-i))
  28. returntrue;
  29. }
  30. returnfalse;
  31. }
  32. voidqueen(intnum,vector<int>&state)
  33. {
  34. for(inti=0;i<num;i++)
  35. {
  36. state.clear();
  37. state.push_back(i);
  38. intpos=0;
  39. while(state.size()!=num)
  40. {
  41. if(conflict(state,pos))//冲突了
  42. {
  43. if(pos==num-1)//已经是最后一个位置
  44. {
  45. state.pop_back();
  46. break;
  47. }
  48. pos++;//尝试下一个pos
  49. continue;
  50. }
  51. else//没有冲突
  52. {
  53. state.push_back(pos);
  54. pos=0;
  55. }
  56. }
  57. if(state.size()==num)
  58. return;
  59. }
  60. }
  61. voidprint(intnum,constvector<int>result)
  62. {
  63. for(inti=0;i<result.size();i++)
  64. {
  65. for(intj=0;j<result[i];j++)
  66. cout<<".";
  67. cout<<"X";
  68. for(intj=0;j<num-result[i]-1;j++)
  69. cout<<".";
  70. cout<<endl;
  71. }
  72. }
  73. intmain()
  74. {
  75. vector<int>state;
  76. queen(16,state);
  77. print(16,state);
  78. }

在实现之后,对比了一下,效率的差距果然满大,python跑14皇后,等了几分钟没搞定,而c++跑16皇后,都是刷的一下出来了,不过可能c++没有用递归也是一个原因。

最后再总结2句:
1 一本书,无论薄厚,都不能欺负它,不要想1,2天就看完
2 c++虽然经典,但书籍过老了,要拿一门有活力的语言为它开路,其实boost的c++已经很python了。

分享到:
评论

相关推荐

    C++算法实现

    6. 回溯算法:用于解决组合优化问题,如八皇后问题、数独等。 7. 分治算法:将大问题分解为小问题来解决,例如快速傅里叶变换(FFT)和矩阵乘法。 8. 字符串匹配算法:如KMP算法、Boyer-Moore算法,常用于文本处理...

    《数据结构与算法之美》的学习笔记和python代码实现.zip

    《数据结构与算法之美》的学习笔记和Python代码实现提供了一条深入理解这些概念的途径,尤其适合大学生以及初学者,无论你是C/C++/JAVA还是Python的爱好者。 一、数据结构 数据结构是组织和管理大量数据的方式,它...

    《算法设计、分析与实现从入门到精通》源码

    《算法设计、分析与实现从入门到精通》是徐子珊教授编写的一本经典教材,旨在帮助初学者和进阶者深入理解算法的本质,掌握设计、分析和实现算法的技能。这本书涵盖了C、C++和Java三种编程语言,使得读者可以根据自己...

    常见数据结构和算法的多语言实现。.zip

    本资源包涵盖了多种语言,包括C、C++、Java和Python,提供了这些语言中常见数据结构和算法的实现,这对于大学生深入学习数据结构与算法非常有帮助。 1. 数据结构: - **数组**:是最基本的数据结构,它是一组相同...

    algorithms:用Python和C ++编写的算法的集合

    通过这个集合,你可以对比Python和C++在实现相同算法时的差异,加深对两种语言的理解,并提升算法设计和实现的能力。无论你是初学者还是有经验的开发者,这个资源都能为你提供宝贵的参考和学习机会。在实践中不断...

    My-leetcode-solutions:我对leetcode的算法(python,javascript,java)问题的解决方案

    5. **回溯法**:用于解决组合优化问题,如八皇后问题、数独填数等。 6. **贪心算法**:在每一步选择最优解,如活动选择问题、霍夫曼编码等。 7. **数据结构**:如栈、队列、链表、树、图、哈希表等,它们是算法...

    算法设计与分析基础第三版答案

    同时,可能还会介绍如何用伪代码或特定编程语言(如Python或C++)实现这些算法。 在学习这个答案集时,读者不仅可以检验自己的理解,还能通过对比不同算法的优劣来提升解决问题的能力。例如,可能会比较贪心算法和...

    前几年的蓝桥杯的一些试题

    8. **编程语言基础**:如C/C++/Java/Python等,熟悉其语法特性和性能特性,了解如何写出高效且优雅的代码。 9. **逻辑思维**:解决复杂问题时,良好的逻辑思维能力能帮助分析问题,找到最优解决方案。 10. **调试...

    coding-review

    6. **递归与回溯**:Python的递归功能强大,是解决许多问题的有效手段,比如八皇后问题、N皇后问题和数独填充。回溯算法是递归的一种形式,常用于在大量可能性中寻找解。 7. **字符串处理**:Python的字符串处理...

    华为OD机试真题整理合集

    1. **编程语言基础**:华为OD机试通常支持多种编程语言,如C++、Java、Python等。熟练掌握至少一种语言,包括语法、数据类型、控制结构、函数、异常处理等方面的知识。 2. **数据结构与算法**: - **数组与链表**...

    AtCoder:我对AtCoder问题的回答

    尽管Python在运行速度上可能不敌C++或Java,但其易于理解和实现的特性使它成为初学者和快速解决问题的理想选择。 在这个名为"阿特科德:我对AtCoder问题的回答"的项目中,我们可以假设包含的是一个代码仓库,其中...

    二面题目.zip

    - **基本语法**:面试可能会涉及到Java、Python、C++等常见编程语言的基本语法,如变量声明、循环、条件语句、函数定义等。 - **异常处理**:理解并能正确使用try-catch-finally语句,了解不同类型的异常。 - **...

    2014 Multi-University Training Contest 3(标程)

    4. **编程语言**:常见的编程语言如C++、Java和Python在竞赛中被广泛使用,每种语言都有其特性和优势,选择合适的语言可以优化代码执行速度。 5. **调试技巧**:快速定位并修复错误是编程竞赛中必不可少的技能,...

    leetcode_solutions

    "leetcode_solutions"这个压缩包文件很可能是包含了针对LeetCode问题的解答代码,主要涵盖了C++、Python、Java等主流编程语言。下面我们将详细探讨LeetCode中常见的解题策略和算法。 一、解题策略 1. 题目分析:在...

    leetcode题库-Leetcode:Leetcode的代码

    这个压缩包“Leetcode-master”包含了针对LeetCode平台上的题目所编写的代码,提供了丰富的算法实现,涵盖了多种编程语言,如Python、Java、C++等。 一、LeetCode简介 LeetCode是一个集成了各种算法和数据结构问题...

    leetcode分类-LeetCode-:LeetCode刷题的解题代码,按tag分类解题

    通过阅读和理解这些代码,你可以看到不同程序员如何应用上述算法来解决问题,对比不同实现,有助于你形成自己的编程风格和思维方式。 四、实践与提升 利用这份资源,你可以按照标签逐步攻克LeetCode上的题目,从...

    leetcode答案-LeetCode:LeetCode题库的解答

    10. **编程语言特性**:不同的编程语言可能会有不同的实现方式,如C++的STL、Python的内置函数等,理解和掌握这些语言特性可以提高解题效率。 "LeetCode-master"这个文件很可能是整个LeetCode题库的解法仓库,包含...

    Leetcode:这是我的 leetcode 解决方案

    首先,LeetCode 提供了多种编程语言的题目,包括但不限于 Java、Python、C++ 和 JavaScript。每个题目都分为不同的难度级别,从简单到困难,涵盖了从基础算法到高级数据结构的各种问题。这些题目是准备面试、学习新...

    leetcode答案-LeetCode:LeetCode题目以及答案(时间复杂度最优)

    这些解答通常用不同的编程语言实现,如Java、Python、C++等,并且优化了算法,以在满足题目的要求下尽可能减少运行时间。 在LeetCode上,每个题目都会被标记有相应的标签,如“数组”、“二叉树”、“动态规划”等...

    leetcode答案-Leetcode:力码

    4. **语言特性**:使用不同编程语言解决问题,可以加深对语言特性的理解和应用,比如Python的列表推导式、C++的模板、Java的泛型等。 5. **时间空间复杂度分析**:了解和计算算法的时间复杂度和空间复杂度,是衡量...

Global site tag (gtag.js) - Google Analytics