• SCAU 9502 ARDF


    9502 ARDF

    时间限制:1000MS  内存限制:65535K 提交次数:0 通过次数:0

    题型: 编程题   语言: 无限制

    Description

        ARDF,全称无线电测向。无线电测向运动是竞技体育项目之一,也是无线电活动的主要内容。它类似于众所周知的捉迷藏游戏,但它是寻找能发射无线电波的小型信号源(即发射机), 是无线电捉迷藏,是现代无线电通讯技术与传统捉迷藏游戏的结合。大致过程是:在旷野、山丘的丛林或近郊、公园等优美的自然环境中,事先隐藏好数部信号源,定时发出规定的电报信号。 参加者手持无线电测向机,测出隐蔽电台的所在方向,采用徒步方式,奔跑一定距离,迅速、准确地逐个寻找出这些信号源。以在规定时间内,找满指定台数、实用时间少者为优胜。 通常, 我们把实现巧妙隐藏起来的信号源比喻成狡猾的狐狸,故此项运动又称无线电“猎狐”或抓“狐狸”。
        摩斯密码是一种时通时断的信号代码,这种信号代码通过不同的排列顺序来表达不同的英文字母、数字和标点符号等。摩斯密码中,-表示长,.表示短。 摩斯密码表示两个字元是采用直接相连法,即直接将第二个字元的摩斯密码接到第一个字元摩斯密码的后面。一连串的摩斯密码连成一起,就是要发送的信号。
        无线电测向分为2米波段和80米波段,区别在于电波的波长不同,接收用的机器也不同。 而信号源发出的信号为摩斯密码,测向运动两个波段对应的摩斯密码如下:
        号码	2米波段	80米波段
        0   	-----	-----
        1   	.----	-- ---.
        2   	..---	-- ---..
        3   	...--	-- ---...
        4   	....-	-- ---....
        5   	.....	-- ---.....
        6   	-....	-....
        7   	--...	--...
        8   	---..	---..
        9   	----.	----.
        BM是测向新手,对于辨别信号,信号源定位等方法都不太熟悉。现在,又到训练时间了。教练让BM拿了一部测向机在听信号,以训练辨别信号的能力。 不过,变态的教练不仅要BM分辨每个信号源对应是什么数字,还问这两个数字之和对应的摩斯密码是什么!但是,BM却不知道这是哪个波段的信号,又还没有记熟每个号码对应的摩斯密码,咋办? 答不出可是要罚跑华农一圈啊!!!
        Arokenda在训练过程中不忍心看着BM就这样受罚,就帮了BM一把,给了BM一个摩斯密码对应表和破译多位数的方法,说将两个数变成整数再算。 但是听到某一信号时,BM听了很久还没听完。惨了!数位太多,int存不下,这次又咋办?
        Arokenda说:“还不简单,用long long不就行了吗?long long可以表示-2^63至2^63-1之间的整数,而且又没有double只保留16位精度的问题。就像这样:
        #include<stdio.h>
        int main()
        {
        	long long a;
        	scanf(“%lld”,&a);
        	printf(“%lld”,a);
        	return 0;
        }
        ”
        就在此时,教练发现他们俩的作弊行为!不解释,罚跑运动场3圈!@#$%^&*
        训练还得继续,面对这魔鬼式训练,BM忍不住向大家求救!你能帮一下BM吗?
    

    Input

        输入一个整数T(T<=20),表示教练员有几次测试。
        接下来3行,第一行为一个整数W,表示该信号源是属于哪个波段,2或80。第二、三行为一串摩斯密码,长度不超过90,表示BM听到的两个信号源对应的信号。
    

    Output

        每组数据输出一行,输出两个信号源对应数字之和在相应波段下的摩斯密码。
    

    Sample Input

    3
    2
    .----
    -....
    80
    -- ---.
    -- ---...
    80
    -- ---....
    ---..
    

    Sample Output

    --...
    -- ---....
    -- ---.-- ---..
    

    Hint

        1、VC下long long的数据类型会编译不通过,此时将数据类型写成__int64,scanf和printf要使用%I64d代替%lld。
        2、除了本题之外,其余题目也许也要用到long long,请根据需要自行考虑
    

    Source

    BM

    Provider

    a470086609

     

    #include<stdio.h>
    #include<string.h>
    
    typedef struct {
        int flag;
        int len;
        char chunk[12];
    }present[10];
    
    present sale2, sale80;
    
    void Traverse()
    {
        int i;
        for(i=0; i<10; ++i) {sale2[i].flag = i; sale2[i].len = 5;}
        
        strcpy(sale2[0].chunk , "-----");    strcpy(sale2[1].chunk , ".----");
        strcpy(sale2[2].chunk , "..---");    strcpy(sale2[3].chunk , "...--");
        strcpy(sale2[4].chunk , "....-");    strcpy(sale2[5].chunk , ".....");
        strcpy(sale2[6].chunk , "-....");    strcpy(sale2[7].chunk , "--...");
        strcpy(sale2[8].chunk , "---..");    strcpy(sale2[9].chunk , "----.");
    
        sale80[0].flag = 5; strcpy(sale80[0].chunk , "-- ---....."); sale80[0].len = 11;
        sale80[1].flag = 4; strcpy(sale80[1].chunk , "-- ---...."); sale80[1].len = 10;
        sale80[2].flag = 3; strcpy(sale80[2].chunk , "-- ---..."); sale80[2].len = 9;
        sale80[3].flag = 2; strcpy(sale80[3].chunk , "-- ---.."); sale80[3].len = 8;
        sale80[4].flag = 1; strcpy(sale80[4].chunk , "-- ---."); sale80[4].len = 7;
        sale80[5].flag = 0; strcpy(sale80[5].chunk , "-----"); sale80[5].len = 5;
        sale80[6].flag = 6; strcpy(sale80[6].chunk , "-...."); sale80[6].len = 5;
        sale80[7].flag = 7; strcpy(sale80[7].chunk , "--..."); sale80[7].len = 5;
        sale80[8].flag = 8; strcpy(sale80[8].chunk , "---.."); sale80[8].len = 5;
        sale80[9].flag = 9; strcpy(sale80[9].chunk , "----."); sale80[9].len = 5;
        
        return;
    }
    
    int main()
    {
        int a[20], b[20], sum[20];
        int sel, i, j, T, s1len, s2len, s1cnt, s2cnt, temp, e, len, flag;
        char s1[100], s2[100], *str;
        Traverse();
        scanf("%d", &T);
        while(T--)
        {
            memset(a, 0, sizeof(a));
            memset(b, 0, sizeof(b));
            memset(sum, 0, sizeof(sum));
            memset(s1, 0, sizeof(s1));
            memset(s2, 0, sizeof(s2));
            s2len = s1len = s1cnt = s2cnt = flag = 0;
            scanf("%d", &sel);
            getchar();  //这里有一个回车,而fgets会吸收回车 
            //scanf("%s", s1);
            fgets(s1, 100, stdin);
            fgets(s2, 100, stdin);
            //scanf("%s", s2);
            s1len = strlen(s1)-1, s2len = strlen(s2)-1;
            if(sel == 2)
            {
                for(i=0, str=s1; i<s1len; )
                {
                    for(j=0; j<10; ++j)
                    {
                        if(str == strstr(str, sale2[j].chunk))
                        {
                            i += sale2[j].len;
                            a[s1cnt++] = sale2[j].flag;
                            str = s1+i;
                            break;
                            
                        }
                    }
                }
                
                for(i=0, str=s2; i<s2len; )
                {
                    for(j=0; j<10; ++j)
                    {
                        if(str == strstr(str, sale2[j].chunk))
                        {
                            i += sale2[j].len;
                            b[s2cnt++] = sale2[j].flag;
                            str = s2+i;
                            break;
                        }
                    }
                }
            }
            else 
            {
                for(i=0, str=s1; i<s1len; )
                {
                    for(j=0; j<10; ++j)
                    {
                        if(str == strstr(str, sale80[j].chunk))
                        {
                            i += sale80[j].len;
                            a[s1cnt++] = sale80[j].flag;
                            str = s1+i;
                            break;
                        }
                    }
                }
                
                for(i=0,str=s2; i<s2len; )
                {
                    for(j=0; j<10; ++j)
                    {
                        if(str == strstr(str, sale80[j].chunk))
                        {
                            i += sale80[j].len;
                            b[s2cnt++] = sale80[j].flag;
                            str = s2+i;
                            break;
                        }
                    }
                }
                
            }
            
    
            
            
            for(i=0, j=s1cnt-1; i<j; ++i, --j) {temp = a[i]; a[i] = a[j]; a[j] = temp;} 
            for(i=0, j=s2cnt-1; i<j; ++i, --j) {temp = b[i]; b[i] = b[j]; b[j] = temp;} 
            
        //    for(i=0; i<s1cnt; ++i) {printf("a[%d] = %d\n", i, a[i]);} 
        //    for(i=0; i<s2cnt; ++i) {printf("b[%d] = %d\n", i, b[i]);}
            
            len = s1cnt<s2cnt ? s1cnt:s2cnt;
            
            for(i=0, e=0; i<len; ++i)
            {
                temp = (e + a[i] + b[i]);
                sum[i] = temp%10;
                e = temp/10;
            }
            
            if(i < s1cnt)
            while(i != s1cnt)
            {
                temp = e + a[i] + sum[i];
                sum[i] = temp%10;
                e = temp/10;
                i++;
            }
            
            else 
            while(i != s2cnt)
            {
                temp = e + b[i] + sum[i];
                sum[i] = temp%10;
                e = temp/10;
                i++;
            }
            
            for(; i<20 && e; ++i) 
            {
                temp = e + sum[i];
                sum[i] = temp%10;
                e = temp/10;
            }
            
            for(i=20-1; i>0 && !sum[i]; --i);
            for(; i>=0; --i) 
            {
            //    printf("%d", sum[i]);
                if(sel == 2) printf("%s", sale2[sum[i]].chunk);
                else 
                {
                    if(sum[i]>=6)printf("%s", sale80[sum[i]].chunk);
                    else printf("%s", sale80[5 - sum[i]].chunk);
                }
            }
            printf("\n"); 
        }
        return 0;
    }


    解题报告:

    将摩斯密码中的字元转成数字进行运算,然后再进行转换输出,在80米波段中要注意比较的先后顺序!代码有点长,AC后必须看标程才行。

    不知为啥,还是用上了高精度加法,题目明明提示了用long long,再结合strstr函数,结果就出来了。

    花了点时间,在考虑当中为什么会出现这种情况,思路清晰,但实现确是另外一回事,!!!!!!!!

    ===========================================================================

    《算法竞赛入门经典》(刘汝佳)里有这样一段话:

    在实际编程中,我们经常先编写一个具备主要功能的程序,再加以完善,我们甚至可以先写一个只有输入输出功能的“骨架”,但要确保它

    正确,这样,每次只添加一点点小功能,而且写一点就测试一点,和一次写完整个程序相比,更加不容易出错。这种方法称为:迭代式开发!!

    一开始在初始化结构体时,曾因直接赋值导致错误,然后不得不进行大篇幅更改,类似的代码更加如此,比如下面的两个if-else,因为一开始

    代码复制更改,结构基本一致,但后来DEBUDGE的时候发现出了点差错,同样不得不进行大篇幅更改,这样浪费了不少不必要的时间。这点尤为重要!

    还有就是思维必须要再严谨一点,不然到最后还是会一摊BUG,难以收拾!

    Classic Code
    #include<stdio.h>
    #include<string.h>
    int main()
    {
        int t,kind,i,q,p,k,an,j,ju,y;
        long long sum,e;
        char a[2][100],b[20][15];
        scanf("%d",&t);
        for(i=0;i<t;i++)
        {
            sum=0;
            scanf("%d",&kind);
            getchar();
            gets(a[0]);
            gets(a[1]);
            for(q=0;q<2;q++)
            {
                e=1;
                for(p=strlen(a[q])-1;p>=0;)
                {
                    k=0;
                    if(kind==2)
                    {
                        for(j=p;j>p-5;j--)
                            if(a[q][j]=='.') k++;
                            p=j;
                        if(k&&a[q][j+1]=='-')
                            k=10-k;
                    }
                    else
                    {   ju=0;
                        for(j=p;j>p-9&&j>=0;j--)
                        {
                            if(a[q][j]==' ') {ju=1;break;}
                            if(a[q][j]=='.'&&j>p-5)k++;
                        }
                        if(ju)p=j-3;
                        else
                        {p=p-5;if(k)k=10-k;}
                    }
                    sum=sum+k*e;
                    e=e*10;
                }
            }
            for(y=0;sum;y++)
            {
                an=sum%10;
                if(an>5||an==0)
                switch(an)
                {
                    case 0:strcpy(b[y],"-----");break;
                    case 6:strcpy(b[y],"-....");break;
                    case 7:strcpy(b[y],"--...");break;
                    case 8:strcpy(b[y],"---..");break;
                    case 9:strcpy(b[y],"----.");break;
                    default:break;
                }
                else
                {
                    if(kind==2)
                    {
                        switch(an)
                        {
                            case 1:strcpy(b[y],".----");break;
                            case 2:strcpy(b[y],"..---");break;
                            case 3:strcpy(b[y],"...--");break;
                            case 4:strcpy(b[y],"....-");break;
                            case 5:strcpy(b[y],".....");break;
                            default:break;
                        }
                    }
                    else
                    {
                        switch(an)
                        {
                            case 1:strcpy(b[y],"-- ---.");break;
                            case 2:strcpy(b[y],"-- ---..");break;
                            case 3:strcpy(b[y],"-- ---...");break;
                            case 4:strcpy(b[y],"-- ---....");break;
                            case 5:strcpy(b[y],"-- ---.....");break;
                            default:break;
                        }
                    }
                }
                sum=sum/10;
            }
            for(y--;y>=0;y--)printf("%s",b[y]);
            printf("\n");
        }
        return 0;
    }
  • 相关阅读:
    裁剪圆形图片原理
    Scrollview回弹效果自定义控件
    Android热修复、插件化、组件化
    Android 6.0权限
    Android如何缩减APK包大小
    Android MVP理解
    Mat转化为IplImage类型的方法
    【QT】Qaction和触发函数建立连接的方法
    【QT】【OpenCv】初始配置以及测试功能
    【MATLAB】画信号频谱的子函数
  • 原文地址:https://www.cnblogs.com/liaoguifa/p/2782517.html
Copyright © 2020-2023  润新知