- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
[数学]06-简单算法
题目列表 Robot motion (zju1708, 模拟) Zero sum( USACO 36, 枚举) Mixing milk(usaco76, 贪心) Extended Lights Out( zju 1354, 枚举+贪心) Gone fishing(北美中东部区域赛题目,枚举+贪心) Copying books(zju2002, 二分+贪心) 分析 显然按键是顺序无关的,而且最多按一次(按两次相当于不按)。 最直接的想法:30个按键,每个有两种操作选择,总共要枚举230 =1073741824种方案。本题时限1秒,此方法行不通。 进一步分析 考虑如图所示的操作: X 点击 第2行第2列 X 1 2 3 4 5 1 2 3 4 5 6 1 2 3 4 5 1 2 3 4 5 6 1 2 3 4 5 1 2 3 4 5 进一步分析 考虑如图所示的操作: X X 点击第2行第2列 X X 点击 第2行第3列 1 2 3 4 5 6 1 2 3 4 5 6 进一步分析 考虑如图所示的操作: X X X 点击第2行第2列 点击第2行第3列 点击 第2行第5列 X X X 1 2 3 4 5 1 2 3 4 5 6 1 2 3 4 5 1 2 3 4 5 6 进一步分析 考虑如图所示的操作: X X X 点击第2行第2列 点击第2行第3列 点击第2行第5列 进一步分析 只有在第2行的操作才能使第1行全灭。 在3、4、5行的操作对1行完全没影响。 X X X 点击2行2列 点击2行3列 点击2行5列 进一步分析 如果第2行的操作没有使第1行全灭, 则后面对3、4、5行进行的操作都无任何实质作用。 X X 点击2行2列 点击2行3列 进一步分析 这也说明第2行的操作受第1行亮灭的情况约束。 如果第1行某列亮着,则在它的下一行同一列点击。 X X X 点击2行2列 点击2行3列 点击2行5列 进一步分析 保证了第1行全灭,第2行未必全灭, 于是需要第3行的操作。 X X X X 进一步分析 后面各行的操作都受其上一行约束 X X X X X X X X X X X X X X X X X 进一步分析 各行操作结束后,判断最后一行是否全灭。 全灭,则答案就找到了;否则考虑改变第1行。 X X X X X X X X 进一步分析 因为只有第1行的操作没有约束。 X X X X X X X X 解决 毫无疑问,搜索之。第1行有6个格,每格点或不点,共26=64种状态。 不再是起初凭直觉的遍历1073741824个状态,效率大大提高了。 要是按列来考虑,第1列有5个格,搜索25=32个状态就可以了。 程序实现 #includeiostream.h #includememory.h void process();//求解的过程 void press(int,int);//处理按键的过程 void output();//输出结果 int lights[5][6];//记录灯状态,0灭,1亮 int ans[5][6];//记录结果,若在x行y列点击,ans[x-1][y-1]=1 int main(){ //主函数 int n; cinn; for(int i=1;i=n;i++){ cout PUZZLE # iendl; process(); //求解过程 } } void process(){ int x,y,z,temp[5][6]; for(x=0;x5;x++) for(y=0;y6;y++) cintemp[x][y]; for(z=0; z64; z++){ //外循环,枚举64个状态 memcpy(lights, temp, sizeof(lights)); memset(ans, 0, sizeof(ans));//初始化 for(y=0; y6; y++) if (z (1y)) /* 如果z右起第y个bit位是‘1’则在第1行y列点击 */ press(0,y); //枚举第一行的64种操作。 for(x=1; x5; x++) for(y=0; y6; y++) if (lights[x-1][y] ==1) press(x,y);/*就是刚才所说的规则*/ for(y=0;y6;y++) if(lights[4][y]==1) b
您可能关注的文档
最近下载
- 2023年山东省青岛市市北区“未来之星”选拔活动试卷(四、五年级).pdf VIP
- 鲁科版高中化学目录.pdf VIP
- 金融英语翻译 Chapter 15 应收款项.pptx VIP
- 烟草法律知识考试真题题库(含答案).pdf VIP
- 三年级上册 劳动教案.pdf VIP
- DB12T 775-2018 防雷装置检测业务规范.docx VIP
- 专题2.6 一元二次方程应用-几何动态问题(专项训练).pdf VIP
- 觉醒年代人物小传800字.doc VIP
- [通力KONE电梯资料]CTP-07.30.S2A_安全钳.pdf VIP
- 【名校课堂】九年级数学下册 28.1 锐角三角函数 正弦(第1课时)练习 (新版)新人教版.doc VIP
文档评论(0)