在线做题---呼叫转移系统

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

  今天把第0期的呼叫转移系统的题目看了下,第一次自己写的时候,没把情况考虑全。后来参考了别人的思路,最终把它给弄出来了。

     要解决的就两个问题:

  1)当天设置了多少个呼叫转移
  2)最长的呼叫转移是多长次 ( A君转到B君,B君再转到C君。这个是2次呼叫转移)

  第一个问题很好解决,只需判断要求的那天是否在某个人的假期里,在的话,总数++就OK了。

  对于第二个问题,我的思路是遍历每个人,然后判断每个在假期里的人在那天总共要转移多少次,即找到他在那天要转移到哪个号码上,被转移到的那个好吗还是在假期,那么再递归求下一个,最后就能得到总的转移次数。再比较得出最大的那个即可。

  如果要判断是否存在环路的话,那么只要在求最大转移次数的时候,记录下初始号码,然后再每次查找下一个号码的时候判断一下是否跟初始号码相同,如果相同的话就存在环路。我在程序里面就没有实现这一步了,因为题目的输入假设是不存在环路的。

下面是我的代码实现:

//伯乐在线编程  第一期 呼叫转移系统
#include <stdio.h>
#include <stdlib.h>
#include <string.h>


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
");
        return 0;
    }

    fscanf(fp,"%d",&nPerson);
    p = (PERSON *)malloc(nPerson * sizeof(PERSON));
    if (p == NULL)
    {
        printf("MALLOC ERROR
");
        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.
",i,(p+i)->szSrcNum,(p+i)->szDstNum,
            (p+i)->nStartDay,(p+i)->nPeriod);
    }

    nCount = totalCount();
    nMax = Depth();

    printf("第 %d 天共有 %d 个呼叫转移设置
",nDay,nCount);
    printf("第 %d 天最长的呼叫转移是 %d 次
",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
原文地址:https://www.cnblogs.com/Jason-Damon/p/3139032.html