回 帖 发 新 帖 刷新版面

主题:[讨论]第八次编程比赛题目

严重道歉,各位,我来晚了.比赛时间延长150分钟.

/////////////////////////////////////////////////////////////////////////////////
[color=FF0000]注意:不得不再提醒大家一下,你们的排名不仅将同你的正确率有关,另一个重要因素是效率,所以请在保证正确的情况下,尽量提高你的时空效率.[/color]
/////////////////////////////////////////////////////////////////////////////////

1.注释提取器
[题目描述]
  给出一个程序源代码
  要求输出其注释部分内容.即/* 与 */中的内容

[输入样例]
  #include <stdio.h>/*  Hello world*/
  int main(){
    printf("example.");/* 世界,你好. */
    return 0;
  }
[输出样例]:
    Hello world 世界,你好.
  提示:包括空格.

2.单词查找树(TRIE)
[题目描述]
在进行文法分析的时候,通常需要检测一个单词是否在我们的单词列表里。为了提高查找和定位的速度,通常都要画出与单词列表所对应的单词查找树,其特点如下:
根节点不包含字母,除根节点外每一个节点都仅包含一个大写英文字母;
从根节点到某一节点,路径上经过的字母依次连起来所构成的字母序列,称为该节点对应的单词。单词列表中的每个词,都是该单词查找树某个节点所对应的单词;
在满足上述条件下,该单词查找树的节点数最少。
例:
对一个确定的单词列表,请统计对应的单词查找树的节点数(包括根节点)

[输入样例]
注:为一个单词列表,每一行仅包含一个单词和一个换行/回车符。每个单词仅由大写的英文字符组成,长度不超过63个字符。文件总长度不超过32K,至少有一行数据.

A
AN
ASP
AS
ASC
ASCII
BAS
BASIC

[输出样例]
注:该文件中仅包含一个整数和一个换行/回车符。该整数为单词列表对应的单词查找树的节点数。
13

4.墙上的灯
[题目描述]:
Arthur King的城堡有一个圆形的大厅。大厅的墙壁上有N盏灯,分别按顺序从1到N编号。每盏灯都可以每打开或关上。在每一秒钟,如果第I+1盏灯是亮的,那么第I盏灯在下一秒会变化它的状态;特别的,如果第1盏灯是亮的,那么第N盏灯在下一秒会变化它的状态。
Arthur King给你某一时刻所有灯的状态,希望你能求出它们在M秒之后的状态。你正好想加入圆桌骑士的行列,赶快抓住这个机会,向Arthur King证明你的实力吧。

[输入描述]:
输入文件有N+1行。第一行有两个数N,M。此后N行,每行是一个数,不是0就是1。第I+1行的数描述初始时第I盏灯的状态。如果这个数为0,表示第I盏灯是灭的;如果这个数为1,表示第I盏灯是亮的。
20<N<500,2<M<200000

[输出描述]:
输出文件有N行,每行一个数,不是0就是1。第I行的数描述M秒后第I盏灯的状态。如果这个数为0,表示第I盏灯是灭的;如果这个数为1,表示第I盏灯是亮的。

[输入范例]:
3 1
0
0
1


[输出范例]:
0
1
1

4.强强的烦恼
[题目描述]:
新的赛季即将来临,强强将派出自己的球队---强强队 去参加这来之不易的比赛,由于这场比赛非常重要,强强 不光要考虑队员的体力和技术 还必须考虑到整个球队队员的亲密程度,如果球队中出现一些亲密度较差的队员那么一定会影响这个比赛的成绩,这个问题使强强很伤脑筋,因为他训练的队员太多了,无法完全掌握所有队员之间的亲密度~~。再这样下去强强精神就要崩溃了,看来我们还是要想个办法帮帮他。
你设计了一个程序,由程序存入各个球员之间的信息,用来方便强强查询。


输入数据:第一行3个数N,M,K 表示有N个队员M个关系以及K次询问(1<N<=2000,1<=M<=500000,1<=K<=500000)
接下来M+K行 ,前M行给出A,B(A<>B   A B分别表示不同的两个队员的球衣编号A<=2000 B<=2000)两队员的关系(F表示亲密度较高 E表示亲密度较低) 后K行为强强的询问
值得注意的是:如果A与B亲密度比较低 B与C亲密度也比较低 那么A与C的亲密度就算为比较高咯
如果A与B亲密度比较高 B与C亲密度也比较高 那么A与C的亲密度就算为比较高咯

[输入样例]:
5 4 4
1 2 F
2 3 F
1 4 E
4 5 E
1 5
1 3
2 4
2 5
[输出样例]注:输出K行 如果询问的对象亲密度比较高则输出 高 如果亲密度比较低则输出 低 如果不清楚询问对象的关系那么就输出 不知道
例:


不知道

回复列表 (共35个回复)

31 楼

接上:
long SolveOld(Relation a[], long len, long add)//根据输入的原始数据推出新的队员之间的关系
{
    long i, j;
    
    for(i=0; i<len-1; i++) //根据输入的原始数据推出新的队员之间的关系
        for(j=i+1; j<len; j++)//把前面的数据依次和后面的数据比较,不重复比较(即不做反方向的比较)
        {
            if(a[i].g == a[j].g) //如果两者的关系相同,找出两者中相同的队员
            {
                if(a[i].A == a[j].A)
                {
                    if(SearchAA(a, len, i, j)) //如a[n]不存在,则创建它,即得到一个新的队员之间的关系  
                    {
                        a[len+add].A = a[i].B;
                        a[len+add].B = a[j].B;
                        a[len+add].g = 'F';
                        add++;    //累积新得到的队员之间的关系  
                    }
                }                              
                else if(a[i].A == a[j].B)
                {
                    if(SearchAB(a, len, i, j)) //如a[n]不存在,则创建它
                    {
                        a[len+add].A = a[i].B;
                        a[len+add].B = a[j].A;
                        a[len+add].g = 'F';
                        add++;
                    }
                }
                else if(a[i].B == a[j].A)
                {
                    if(SearchBA(a, len, i, j)) //如a[n]不存在,则创建它
                    {
                        a[len+add].A = a[i].A;
                        a[len+add].B = a[j].B;
                        a[len+add].g = 'F';
                        add++;
                    }
                }
                else if(a[i].B == a[j].B)
                {
                    if(SearchBB(a, len, i, j)) //如a[n]不存在,则创建它
                    {
                        a[len+add].A = a[i].A;
                        a[len+add].B = a[j].A;
                        a[len+add].g = 'F';
                        add++;
                    }
                }
            }
        }
    return add;
}

32 楼

接上
long SolveNew(Relation a[], long *len, long add)//分析新产生的数据
{
    long len_copy; //存储结构体数组的原有长度
    long i, j;
    
    len_copy = *len; //保留原有数组长度
    *len += add; //得到新的数组长度
    add = 0;  //重新计数
    for(i=*len-1; i>=len_copy; i--) //只将新得到的数据和其他数据比较
        for(j=i-1; j>=0; j--)
        {
            if(a[i].g == a[j].g) //如果两者的关系相同
            {
                if(a[i].A == a[j].A)
                {
                    if(SearchAA(a, *len, i, j)) //如a[n]不存在,则创建它
                    {
                        a[*len+add].A = a[i].B;
                        a[*len+add].B = a[j].B;
                        a[*len+add].g = 'F';
                        add++;
                    }
                }                              
                else if(a[i].A == a[j].B)
                {
                    if(SearchAB(a, *len, i, j)) //如a[n]不存在,则创建它
                    {
                        a[*len+add].A = a[i].B;
                        a[*len+add].B = a[j].A;
                        a[*len+add].g = 'F';
                        add++;
                    }
                }
                else if(a[i].B == a[j].A)
                {
                    if(SearchBA(a, *len, i, j)) //如a[n]不存在,则创建它
                    {
                        a[*len+add].A = a[i].A;
                        a[*len+add].B = a[j].B;
                        a[*len+add].g = 'F';
                        add++;
                    }
                }
                else if(a[i].B == a[j].B)
                {
                    if(SearchBB(a, *len, i, j)) //如a[n]不存在,则创建它
                    {
                        a[*len+add].A = a[i].A;
                        a[*len+add].B = a[j].A;
                        a[*len+add].g = 'F';
                        add++;
                    }
                }
            }
        }
    return add;        
}
int SearchAA(Relation a[], long len, long num1, long num2)
{
    long i;
    
    for(i=0; i<len; i++)//搜索整个数组,若表示该关系的数据已存在,返回0,否则返回1要求构造新数据
    {
        if((a[i].A==a[num1].B)&&(a[i].B==a[num2].B) || (a[i].B==a[num1].B)&&(a[i].A==a[num2].B))
            return 0;
    }
    return 1;
}
int SearchAB(Relation a[], long len, long num1, long num2)
{
    long i;
    
    for(i=0; i<len; i++)
    {
        if((a[i].A==a[num1].B)&&(a[i].B==a[num2].A) || (a[i].B==a[num1].B)&&(a[i].A==a[num2].A))
            return 0;
    }
    return 1;
}
int SearchBA(Relation a[], long len, long num1, long num2)
{
    long i;
    
    for(i=0; i<len; i++)
    {
        if((a[i].A==a[num1].A)&&(a[i].B==a[num2].B) || (a[i].B==a[num1].A)&&(a[i].A==a[num2].B))
            return 0;
    }
    return 1;
}
int SearchBB(Relation a[], long len, long num1, long num2)
{
    long i;
    
    for(i=0; i<len; i++)
    {
        if((a[i].A==a[num1].A)&&(a[i].B==a[num2].A) || (a[i].B==a[num1].A)&&(a[i].A==a[num2].A))
            return 0;
    }
    return 1;
}

33 楼

/*1*/
#include<stdio.h>
main()
{
    FILE*fp ;
    char filename[15],ch1,ch2,ch3 ;
    int flag=0,num=0 ;
    printf("please input the name of ducument you want to open:");
    scanf("%s",filename);
    printf("\n");
    if((fp=fopen(filename,"r"))==NULL)
    {
        printf("cannot open the ducument!\n");
        exit(0);
    }
    ch2=fgetc(fp);
    ch3=fgetc(fp);
    while((ch1!=EOF)&&(ch2!=EOF))
    {
        ch1=ch2 ;
        ch2=ch3 ;
        ch3=fgetc(fp);
        if((ch1=='"')&&(!flag))
            num++ ;    /* 记录注释外面引号的个数,如果为奇数,则跳过循环*/
        if(num%2!=0)
            continue ;
        if((ch1=='/')&&(ch2=='*'))
        {
            flag=1 ;
        }
        if((ch2=='*')&&(ch3=='/'))
        {
            flag=0 ;
        }
        if(flag)
        {
            if((ch1=='/')&&(ch2=='*'))
            continue ;
            putch(ch2);
        }
    }
    fclose(fp);
    getch();
}
/*测试结果:
#include <stdio.h>
/*   Hello world*/
int main()
{
    "printf("example.");
    /* " 世界,你好" !*/"
    return 0 ;
printf("/*dk"jdjd"k*/");
}
输出  Hello world " 世界,你好" !
测试时考虑了注释里外双引号,结果正确。

34 楼

/*3。2题和4题不会*/
#include<stdio.h>
#include<stdlib.h>

int conv(char ch)
{
    return(ch-'0');
}

void lampstata(int num,int T,FILE*fp)
{
    int*p,*head=(int*)malloc(sizeof(int)*num),i,flag=0 ;
    char ch ;
    p=head ;
    if(p==NULL)
    {
        printf("malloc error!");
        exit(0);
    }
    ch=fgetc(fp);
    while(ch!=EOF)
    {
        if(ch=='\n')
        {
            ch=fgetc(fp);
            continue ;
        }
        *p=conv(ch);
        p++;
        ch=fgetc(fp);
    }
    p=head ;
    while(T>0)
    {
        flag=p[0];
        for(i=1;i<num;i++)
        {
            if(p[i])
            p[i-1]=!p[i-1];
        }
        if(flag)
            p[num-1]=!p[num-1];
        T--;
    }
    for(i=0;i<num;i++)
        printf("%d\n",p[i]);
    free(head);
}

main()
{
    FILE*fp ;
    int num,T ;
    char filename[15];
    printf("please input the filename you want to open:");
    scanf("%s",filename);
    if((fp=fopen("e2.txt","r"))==NULL)
    {
        printf("the file can not open!\n");
        exit(0);
    }
    num=conv(fgetc(fp));
    fgetc(fp);
    T=conv(fgetc(fp));
    lampstata(num,T,fp);
    fclose(fp);
    getch();
}

35 楼

20楼
没有给name[16384];指针元素分配空间

我来回复

您尚未登录,请登录后再回复。点此登录或注册