网站大量收购闲置独家精品文档,联系QQ:2885784924

枚举中状态空间演化的抽象与实现.ppt

  1. 1、本文档共32页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
* 右移运算符 对于无符号数,如unsigned long, unsigned int, unsigned short, unsigned char类型的变量,则右移时,高位总是补0。 右移运算符不会改变左操作数的值。 实际上,右移n位,就相当于左操作数除以2n,并且将结果往小里取整。 #include stdio.h int main() { int n1 = 15; short n2 = -15; unsigned short n3 = 0xffe0; unsigned char c = 15; n1 = n12; n2 = 3; n3 = 4; c = 3; printf( n1=%x,n2=%d,n3=%x,c=%x,n1,n2,n3,c); return 0; } 上面的程序输出结果是: n1=3,n2=-2,n3=ffe,c=1 n1: 0000 0000 0000 0000 0000 0000 0000 1111 n2: 1111 1111 1111 0001 n3: 1111 1111 1110 0000 c: 0000 1111 n1 = 2: 0000 0000 0000 0000 0000 0000 0000 0011 n2 = 3: 1111 1111 1111 1110 n3 = 4: 0000 1111 1111 1110 c = 3; 0000 0001 * 思考题 有两个int型的变量a和n(0 = n = 31), 要求写一个表达式,使该表达式的值和a的第n位相同。 答案: (a (1 n )) n * 负数在计算机内采用补码表示,遵循“取反加1的规则” * Int: 0000 0000 0000 0000 0000 0000 0000 1111 ?0000 0000 0000 0111 1000 0000 0000 0000 (int的值域为21474837,32位) short: 0000 0000 0000 1111 ?1000 0000 0000 0000 (short的值域为-32768~32767,16位) unsigned short: 0000 0000 0000 1111 ? 1000 0000 0000 0000 ( unsigned short的值域为0~65535,16位) unsigned char: 0000 1111 ? 1100 0000 ( unsigned char的值域为0~255,8位) 北京大学《程序设计实习》课程 程序设计实习 C++应用示例: 枚举中状态空间演化的抽象与实现 一个房间有4面墙, 每一面墙可以是5种颜色之一: 红色(RED),黄色(YEL),蓝色(BLU),绿色(GRE),白色(WHI) 那么这个房间的状态共有5*5*5*5=54种可能 如何对这些状态依次进行检查? 在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个甚至更多的变元, 怎么办? 如果一个问题的状态中, 变元数量由输入数据决定怎么办? 分析问题 状态的构成: N个变元的值的组合 每个变元的取值范围是一个有限集合 当变元的取值范围是无限集合时, 使用枚举策略逐个检查状态的策略是行不通的 按照一定的规则, 从一个状态出发, 演化出全部的状态. 演化过程中,必须确保 能够演化到每个状态 不能出现循环演化, 即: 如果状态A可演化出状态B, 则从B一定不能演化到A 方案二: 状态演化 用一个数组state[5],数组元素的初始值为0 前4个元素分别表示一面墙的颜色, 最后一个元素表示是否演化出全部状态 while(state[4]==0) { ……//检查当前状态 //演化到下一个状态 state[0]++; i=0; //模拟进位系统,当每位值达到5时,执行进位(本位置0,上一位加1) while(state[i]==5) { state[i]=0; i++; state[i]++; } } 程序结构优化: 将状态演化独立出来 状态演化独立出来, 程序的结构更清晰 编程时,能够集中于状态的

文档评论(0)

wxc6688 + 关注
实名认证
内容提供者

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

1亿VIP精品文档

相关文档