参考程序:
#include
int T,M,N,K;
#define MAX_NUM 55
int aField[MAX_NUM][MAX_NUM];
int main() { int i,j,t,m,n; scanf(\ for(t=0;t 5 进入花生地 //下面检查剩余的时间够不够走到nMaxi,nMaxj处,摘取花生,并回到路上 if(nTotalTime+nMaxi+1+abs(nMaxi-nCuri)+abs(nMaxj-nCurj)<=K) { nTotalTime+=1+abs(nMaxi-nCuri)+abs(nMaxj-nCurj); nCuri=nMaxi; nCurj=nMaxj; nTotalPeanuts+=aField[nMaxi][nMaxj]; aField[nMaxi][nMaxj]=0; //摘走花生赋值为0 } else break; } printf(\ } return 0; } 实现技巧: 用二维数组存放花生地的信息是很自然的想法。然而,用aField[0][0]还是aField[1][1] 对应花生地的左上角,是值得思考一下的。因为从地里到路上还需要1 个单位时间,题目中的坐标又都是从1 开始,所以若aField[1][1] 对应花生地的左上角,则从aField[i][j] 点,回到路上所需时间就是i,这样更为方便和自然,不易出错。并不是C/C++ 的数组下标从0 开始,我们使用数组的时候,就要从下标为0 的元素开始用。 常见问题: 问题一:读题时应该仔细读。有的同学没有看到每次只能拿剩下花生株中最大的,而是希望找到一种在规定时间内能够拿最多花生的组合,把题目变成了另外一道题。 问题二:有的同学没有读到“没有两株花生株的花生数目相同”的条件,因此把题目复杂化了。 问题三:这个题目是假设猴子在取花生的过程中不会回到大路上的,有些同学在思考是否可能在中间回到大路上,因为题目没说在大路上移动要花时间,所以有可能中途出来再进去摘的花生更多。 CS53:显示器(见CS327) (来源:poj.grids.cn 2745,程序设计导引及在线实践(李文新)例6.3 P147) 问题描述: 你的一个朋友刚买了一台新电脑,之前,他用过的最好的电脑只能是便携式计数器。现在,你的朋友看着他的新电脑,他很失望,因为他喜欢他的计数器的LC显示器。因此你决定给你的朋友编写一个程序模拟LC显示器来显示数字。 6 输入: 输入文件包含多行,每一行为需要显示的数。每一行中有两个整数s和n,1<=s<=10,0<=n<=99999999。n为要显示的数值,s是显示的大小。 输入文件的最后一行为两个0,这一行不需要处理。 输出: 以LC显示器方式输出输入文件中的数,用符号“-”表示水平的线段,用符号“|”表示垂直的线段。数值中的每个数字占s+2列,2s+3行。在输出时,对每两个数字之间的空白区域,要确保用空格填满,对最后一位数字之后的空白区域,不能输出空格。每两个数字之间仅有一个空列。(样例输出中给出了0~9每个数字的输出格式) 每个数值之后输出一个空行。 样例输入: 2 12345 3 67890 0 0 样例输出: -- -- -- | | | | | | | | | | | | -- -- -- -- | | | | | | | | | | -- -- -- --- --- --- --- --- | | | | | | | | | | | | | | | | | | | | | | | | --- --- --- | | | | | | | | | | | | | | | | | | | | | | | | --- --- --- --- 解题分析: 一个计算器上的数字显示单元,可以看作由以下编号从1 到7 的7 个笔画组成: 7 图 5-3 显示单元的笔画 那么,我们可以说,数字8 覆盖了所有的笔画,数字7 覆盖笔画1、3 和6,而数字1 覆盖笔画3、6。注意,每个笔画都是由s 个’-‘或s 个’|’ 组成。 输出时,先输出第1 行,即整数n 中所有数字里的笔画1,然后输出第2 行到第s+1 行,即所有数字的笔画2 和笔画3,接下来是第s+2 行,即所有数字的笔画4,再接下来是第s+3 行到2×s+2 行,,就是所有数字的笔画 5 和笔画6,最后的第2×s+3 行,是所有数字的笔画7。如果某个数字d 没有覆盖某个笔画m (m = 1…7),那么,输出数字d 的笔画m 的时候,就应该都输出空格;如果覆盖了笔画m,则输出s 个’-‘或s 个’|’ ,这取决于笔画m 是横的还是竖的。 由上思路,解决这道题目的关键,就在于如何记录每个数字都覆盖了哪些笔画。实际上,如果我们记录的是每个笔画都被哪些数字覆盖,则程序实现起来更为容易。一个笔画被哪些数字所覆盖,可以用一个数组来记录,比如记录笔画1 覆盖情况的数组如下: char n1[11] = {\ 其中,n1[i](i = 0……9) 代表笔画1 是否被数字i 覆盖。如果是,则n1[i] 为'-',如果否,则n1[i] 为空格。上面的数组的值体现了笔画1 被数字0, 2, 3, 5, 6, 7, 8, 9 覆盖。 对于竖向的笔画2,由字符 '|' 组成,则记录其覆盖情况的数组如下: char n2[11] = {\ 该数组的值体现了笔画2 被数字0, 4,5, 6, 8, 9 覆盖。 参考程序: //显示器(见CS327) poj.grids.cn 2745 #include char n1[11] = {\笔画1 被数字0, 2, 3, 5, 6, 7, 8, 9 覆盖 char n2[11] = {\笔画2 被数字0, 4, 5, 6, 8,9 覆盖 char n3[11] = {\笔画3 被数字0, 1, 2,3,4,7, 8,9 覆盖 char n4[11] = {\笔画4 被数字2, 3, 4, 5, 6, 8, 9 覆盖 char n5[11] = {\笔画5 被数字0, 2, 6, 8 覆盖 char n6[11] = {\笔画6 被数字0, 1, 3, 4, 5, 6, 7,8, 9 覆盖 char n7[11] = {\笔画7 被数字0, 2, 3, 5, 6,8, 9 覆盖 int main() { int s; 8 char szNumber[20]; int nDigit,nLength,i,j,k; while(1) { scanf(\ if(s==0) break; nLength=strlen(szNumber); //输出所有数字的笔画1 for(i=0;i nDigit=szNumber[i]-'0'; printf(\ for(j=0;j printf(\ for(i=0;i for(j=0;j nDigit=szNumber[j]-'0'; printf(\ for(k=0;k printf(\笔画2和笔画3之间的空格 printf(\ } printf(\ } for(i=0;i printf(\ nDigit=szNumber[i]-'0'; for(j=0;j printf(\ printf(\ } printf(\ 9 if(i!=0)printf(\ if(j!=0)printf(\ if(i!=0)printf(\