博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
在线做题---呼叫转移系统
阅读量:6335 次
发布时间:2019-06-22

本文共 2726 字,大约阅读时间需要 9 分钟。

  最近看到了,觉得题目还比较适中,而且出发点非常好,至少对我这种菜鸟来说。首先,他不排名,其次还公布大家提交的源码,如果不会的话,可以参考别人的代码。并且可以学习高手们的思路和编码风格,对自己有非常大的帮助。以后我会一直坚持跟进他的题目。

  今天把第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

 

转载地址:http://yjioa.baihongyu.com/

你可能感兴趣的文章
Spring+SpringMVC+MyBatis深入学习及搭建(十一)——SpringMVC架构
查看>>
oracle故障解决
查看>>
tcpdump
查看>>
数据库内存结构
查看>>
利用Shell开发跳板机功能脚本案例
查看>>
51CTO的技术门诊谈OSSIM
查看>>
六年心路成长 —— 做自己
查看>>
ios电话拨打进行监听电话状态
查看>>
京东基于Spark的风控系统架构实践和技术细节
查看>>
什么时候使用CountDownLatch
查看>>
C#之MemberwiseClone与Clone
查看>>
Android性能优化之利用Rxlifecycle解决RxJava内存泄漏
查看>>
转: 如何为你的开源项目选择一个合适的开源协议?
查看>>
关系型数据库和NOSQL数据库对比
查看>>
Atitit 记录方法调用参数上下文arguments
查看>>
webstorm常用功能FTP,及常用快捷键
查看>>
eclipse html 打开方式
查看>>
[求助] win7 x64 封装 出现 Administrator.xxxxx 的问题
查看>>
人类投资经理再也无法击败电脑的时代终将到来了...
查看>>
一个最小手势库的实现
查看>>