[数学]06-简单算法.ppt

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 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

文档评论(0)

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

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

1亿VIP精品文档

相关文档