程序设计实习讲义5.

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

逐一枚举a,b,c,d, #include <stdio.h> void main(){ int n; scanf("%d",&n); int I, cube[101]; for(i=0;i<=100;i++) cube[i]=i*i*i; int a,b,c,d; for(a=2;a<=n;a++) for(b=2;b<a;b++) for(c=b;c<a;c++) for(d=c;d<a;d++) if(cube[a] == cube[b]+cube[c]+cube[d]) printf("Cube = %d, Triple = (%d,%d,%d)\n",a,b,c,d); }
程序设计实习 第 五讲
枚举
内容提要


枚举ቤተ መጻሕፍቲ ባይዱ基本思想 程序设计练习 作业
枚举

一种解决问题的方法。例如:求小于N的最大素数 找不到一个数学公式,使得我们根据N就可以计算出这个素数


N-1是素数吗?N-2是素数吗?……N-K是素数的充分必要条件 是:N-K不能被任何一个大于1、小于N-K的素数整除。 判断N-K是否是素数的问题又成了求小于N-K的全部素数 解决方法: 2是素数,记为PRIM0

解题思路
既然按钮按下的顺序不影响最后的结果,不妨假设从第一行 往下一行一行按按钮 按第二行按钮时必须把第一行灯全部熄灭, 否则第三行以后的按钮再也不能改变第一行的灯 这样只要枚举第一行的按钮组合情况,就可以判断所有灯的 熄灭情况。 第一行共有2的6次方种情况。 源程序 1222.cpp
例3:poj1054问题
样例输入:24 样例输出: Cube = 6, Triple = (3,4,5) Cube = 12, Triple = (6,8,10) Cube = 18, Triple = (2,12,16) Cube = 18, Triple = (9,12,15) Cube = 19, Triple = (3,10,18) Cube = 20, Triple = (7,14,17) Cube = 24, Triple = (12,16,20)


输入:第一行是一个正整数N,表示需要解决的案例 数。每个案例由5行组成,每一行包括6个数字。这些 数字以空格隔开,可以是0或1。0表示灯的初始状态 是熄灭的,1表示灯的初始状态是点亮的。 输出:对每个案例,首先输出一行,输出字符串 “PUZZLE #m”,其中m是该案例的序号。接着按照 该案例的输入格式输出5行,其中的1表示需要把对应 的按钮按下,0则表示不需要按对应的按钮。每个数 字以一个空格隔开。

根据PRIM0、PRIM1、… 、PRIMk ,寻找比PRIMk大的最 小素数PRIMk+1。如果PRIMk+1大于N,则PRIMk是我们需 要找的素数,否则继续寻找
枚举的思想:

列出所有可能的情况,逐一检查是否是问题的解 关键: 可能的情况是什么 有序地枚举,不漏掉情况 尽早发现不是解的情况

样例输入
2 011010 100111 001001 100101 011100 001010 101011 001011 101100 010100
样例输出 PUZZLE #1 101001 110101 001011 100100 010000 PUZZLE #2 100111 110000 000100 110101 101101
问题

问,给定一块被踩坏的稻田,求可能的最长的 蛙路上被踩坏的作物的数目。
输入


第一行整数R和C,稻田的行数和列数 第二行整数N,表示被踩坏的作物总数。 后续N行,每行两个整数i,j为被踩坏的作物的 行和列的位置:1<=i<=R,1,1<=j<=C。 每个被踩坏的作物只出现一次。

请你写一个程序,确定需要按下哪些按钮,恰好使得 所有的灯都熄灭。根据上面的规则,我们知道 第2次按下同一个按钮时,将抵消第1次按下时所产 生的结果。因此,每个按钮最多只需要按下一次。 各个按钮被按下的顺序对最终的结果没有影响 对第1行中每盏点亮的灯,按下第2行对应的按钮, 就可以熄灭第1行的全部灯。如此重复下去,可以 熄灭第1、2、3、4行的全部灯。同样,按下第1、 2、3、4、5列的按钮,可以熄灭前5列的灯。
例1:完美立方 (POJ1543)



问题描述: a3 = b3 + c3 + d3为完美立方等式。例如123 = 63 + 83 + 103 。编写一个程序,对任给的正整数N (N≤100),寻找所有的四元组(a, b, c, d),使得a3 = b3 + c3 + d3,其中1<a, b, c, d ≤N。 输入:正整数N (N≤100) 输出:每行输出一个完美立方,按照a的值,从小到大 依次输出。当两个完美立方等式中a的值相同,则依次 按照b、c、d进行非降序排列输出,即b值小的先输出、 然后c值小的先输出、然后d值小的先输出。

稻田
问题

青蛙从外面跳入稻田,踩过一些禾苗,后, 跳出稻田。
问题

蛙路:一个方向,等间距,大于等于3个点 不同蛙路:可以方向不同,间距不同
问题

许多青蛙跳过稻田,形成多条蛙路,不同蛙路 可以踩过同一作物。
问题

青蛙每天早上踩坏 稻田,早上人们发 现稻田有若干株作 物被踩坏,但不知 多少青蛙来过。也 有不在蛙路上的被 踩坏的作物。

例2:熄灯问题(POJ1222)

问题描述:有一个由按钮组成的矩阵,其中每 行有6个按钮,共5行。每个按钮的位置上有一 盏灯。当按下一个按钮后,该按钮以及周围位 置(上边、下边、左边、右边)的灯都会改变一 次。即,如果灯原来是点亮的,就会被熄灭; 如果灯原来是熄灭的,则会被点亮。 在矩阵角上的按钮改变3盏灯的状态 在矩阵边上的按钮改变4盏灯的状态 其他的按钮改变5盏灯的状态

在上图中,左边矩阵中用X标记的按钮表示被按下,右 边的矩阵表示灯状态的改变 对矩阵中的每盏灯设置一个初始状态。请你按按钮,直 至每一盏等都熄灭。与一盏灯毗邻的多个按钮被按下时, 一个操作会抵消另一次操作的结果。在下图中,第2行 第3、5列的按钮都被按下,因此第2行、第4列的灯的 状态就不改变
相关文档
最新文档