9_C++应用示例1_1.pptVIP

  1. 1、本文档共31页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  5. 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  6. 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  7. 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  8. 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
9_C应用示例1_1

思考题: 有两个int型的变量a和n(0 = n = 31), 要求写一个表达式,使该表达式的值和a的第n位相同。 答案: ( a n ) 1 或: (a (1 n )) n * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 程序设计实习 第九讲 C++应用示例1: 枚举中状态空间演化的抽象与实现 考虑一个问题 一个房间有4面墙, 每一面墙可以是5种颜色之一: 红色(RED),黄色(YEL),蓝色(BLU),绿色(GRE),白色(WHI), 黑色(BLA) 那么这个房间的状态共有46种可能 如何对这些状态依次进行检查? 在本月的POJ练习中, 都是枚举问题: 对每一种状态,分别检查, 判断是否该状态是否可以计算出问题的答案 方案一: 循环嵌套 用数字0-4分别表示5种颜色 for(s=0; s5; s++) for(n=0; n5; n++) for(e=0; e5; e++) for(w=0; w5; w++) { …… } 在这个问题的状态中, 只有4个变元,用一个4重循环是可以的 如果一个问题的状态中, 有10个甚至更多的变元, 怎么办? 如果一个问题的状态中, 变元数量由输入数据决定怎么办? 例如本月的POJ练习的第2题, 是一个N*N的方阵 分析问题 状态的构成: N个变元的值的组合 每个变元的取值范围是一个有限集合 当变元的取值范围是无限集合时, 使用枚举策略逐个检查状态的策略是行不通的 按照一定的规则, 从一个状态出发, 演化出全部的状态. 演化过程中,必须确保 能够演化到每个状态 不能出现循环演化, 即: 如果状态A可演化出状态B, 则从B一定不能演化到A 方案二: 状态演化 用一个数组state[5],数组元素的初始值为0 前4个元素分别表示一面墙的颜色, 最后一个元素表示是否演化出全部状态 while(state[4]==0) { ……//检查当前状态 //演化到下一个状态 state[0]++; i=0; while(state[i]==5) { state[i]=0; i++; state[i]++; } } 程序结构优化: 将状态演化独立出来 状态演化独立出来, 程序的结构更清晰 编程时,能够集中于状态的检查 假设有一个抽象数据结构state while(state.final()==false) { ……//检查当前状态, state[i]表示当前状态下第i个变元的值 state++; //演化到下一个状态 } 方案三: 定义一个状态演化类 class CEnumerator { int state[5]; public: CEnumerator(); bool final(); int operator[](int i); CEnumerator operator++(int i); } bool CEnumerator::final() { return state[4]; } int CEnumerator:: operator[](int i) { return state[i]; } int CEnumerator::operator++(int i) { CEnumerator temp; i=0; temp = *this; if ( state[4] ) return temp; state[0]++; while(state[i]==5) { state[i]=0; i++; state[i]++; } return temp; } 方案四:定义一个更通用的状态演化类 class CEnumerator { int *pState; int *pVarScope; int varNumber; public: CEnumerator(int n, int array[]); //n: 变元的数量 //array[]: 每个变元的取值范围 ~CEnumerator(); CEnumerator(CEnumarator ); bool final(); int operator[](int i); CEnumerator operator++(int i); } CEnumerator::CEnumerator(int n, int array[]) { pState=new int[n+1]; pVarScope=new int[n]; varNumber=n; for(int i=0; in; i++) { pState[i]=

文档评论(0)

asd522513656 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档