最近看到了,觉得题目还比较适中,而且出发点非常好,至少对我这种菜鸟来说。首先,他不排名,其次还公布大家提交的源码,如果不会的话,可以参考别人的代码。并且可以学习高手们的思路和编码风格,对自己有非常大的帮助。以后我会一直坚持跟进他的题目。
今天把第0期的的题目看了下,第一次自己写的时候,没把情况考虑全。后来参考了别人的思路,最终把它给弄出来了。
要解决的就两个问题:
1)当天设置了多少个呼叫转移
2)最长的呼叫转移是多长次 ( A君转到B君,B君再转到C君。这个是2次呼叫转移)
第一个问题很好解决,只需判断要求的那天是否在某个人的假期里,在的话,总数++就OK了。
对于第二个问题,我的思路是遍历每个人,然后判断每个在假期里的人在那天总共要转移多少次,即找到他在那天要转移到哪个号码上,被转移到的那个好吗还是在假期,那么再递归求下一个,最后就能得到总的转移次数。再比较得出最大的那个即可。
如果要判断是否存在环路的话,那么只要在求最大转移次数的时候,记录下初始号码,然后再每次查找下一个号码的时候判断一下是否跟初始号码相同,如果相同的话就存在环路。我在程序里面就没有实现这一步了,因为题目的输入假设是不存在环路的。
下面是我的代码实现:
//伯乐在线编程 第一期 呼叫转移系统#include#include #include typedef struct { char szSrcNum[5]; char szDstNum[5]; int nStartDay; int nPeriod;}PERSON;PERSON *p;int nPerson; //总人数int nDay; //计算天数int onHoliday(PERSON *p); //判断是否在度假int totalCount(); //求当天呼叫转移的总次数int Depth();int Calc(char *s);int Match(char *s);int main(){ int i,n = 0; int nMax = 0; //最长的呼叫转移次数 int nCount = 0; //呼叫转移总次数 FILE *fp; fp = fopen("in.txt","r"); if (fp == NULL) { printf("FOPEN ERROR\n"); return 0; } fscanf(fp,"%d",&nPerson); p = (PERSON *)malloc(nPerson * sizeof(PERSON)); if (p == NULL) { printf("MALLOC ERROR\n"); return 0; } while (n < nPerson) { fscanf(fp,"%s%s%d%d",(p+n)->szSrcNum,(p+n)->szDstNum, &(p+n)->nStartDay,&(p+n)->nPeriod); n++; } fscanf(fp,"%d",&nDay); for (i = 0; i < nPerson; i++) { printf("Person %d: %s %s %d %d.\n",i,(p+i)->szSrcNum,(p+i)->szDstNum, (p+i)->nStartDay,(p+i)->nPeriod); } nCount = totalCount(); nMax = Depth(); printf("第 %d 天共有 %d 个呼叫转移设置\n",nDay,nCount); printf("第 %d 天最长的呼叫转移是 %d 次\n",nDay,nMax); free(p); return 0;}int onHoliday(PERSON *p){ int tmp = p->nStartDay + p->nPeriod - 1; if (p->nStartDay < nDay && tmp >= nDay) return 1; if (p->nStartDay == nDay) return 1; return -1;}int totalCount(){ int i,nCount = 0; for (i = 0; i < nPerson; i++) { if (1 == onHoliday(p+i)) nCount++; } return nCount;}int Depth(){ //求最大的呼叫转移次数 int i,nRet,nMax = 0; for (i = 0; i < nPerson; i++) { if (1 == onHoliday(p+i)) { nRet = Calc((p+i)->szDstNum); } nMax = nMax > nRet ? nMax : nRet; } return nMax;}int Calc(char *s){ int nRet; if ((nRet = Match(s)) > 0) { return Calc((p+nRet)->szDstNum) + 1; } else return 1 ;}int Match(char *s){ int i; for (i = 0; i < nPerson; i++) { if (0 == strcmp((p+i)->szSrcNum,s) && //找到目的地址并且也在度假 1 == onHoliday(p+i)) { return i; } } return 0; } 2013/6/16 16:02