哨兵變量flag不小心沒 設置成0。。所以一直WA
9502?ARDF
時間限制:1000MS? 內存限制:65535K
提交次數:0 通過次數:0
題型: 編程題???語言: G++;GCC
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嗎?
輸入格式
??? 輸入一個整數T(T<=20),表示教練員有幾次測試。 ??? 接下來3行,第一行為一個整數W,表示該信號源是屬于哪個波段,2或80。第二、三行為一串摩斯密碼,長度不超過90,表示BM聽到的兩個信號源對應的信號。
輸出格式
??? 每組數據輸出一行,輸出兩個信號源對應數字之和在相應波段下的摩斯密碼。
輸入樣例
5 2 .---- -.... 80 -- ---. -- ---... 80 -- ---.... ---..
輸出樣例
--... -- ---.... -- ---.-- ---..
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char s2[12][50]={{"-----"},{".----"},{"..---"},{"...--"},{"....-"},{"....."},{"-...."},{"--..."},{"---.."},{"----."}};
char s80[12][50]={{"-----"},{"-- ---."},{"-- ---.."},{"-- ---..."},{"-- ---...."},{"-- ---....."},{"-...."},{"--..."},{"---.."},{"----."}};
void pr (long long int n,int i)
{char str[1000][100]={0};int h=0;int j;if (i==2){while (n/10>0)//這里先判斷他有沒有10位。//這樣,就避免了他是0的情況{strcpy(str[h++],s2[n%10]);n /= 10;}strcpy(str[h],s2[n]);//加上最后一位for (j=h;j>=0;j--){printf ("%s",str[j]);}printf ("\n");}else{while (n/10>0){strcpy(str[h++],s80[n%10]);n /= 10;}strcpy(str[h],s80[n]);for (j=h;j>=0;j--){printf ("%s",str[j]);}printf ("\n");}return ;
}
void work()
{int m;scanf ("%d",&m);char str1[100]={0};char str2[100]={0};getchar();//接收上面M的那個回車//就是scanf("%d",&m)的回車gets(str1);gets(str2);//gets 有吃回車的功能/*printf ("%s\n",str1);printf ("%s\n",str2);*/int i;int len1 = strlen(str1);int len2 = strlen(str2);char str_next[100]={0};//用來判斷下一個//用于判斷80那里的。有重復的嫌疑char str_temp[100]={0};int h=0;int j;int f=0;int flag;long long int number1=0;long long int number2=0;//long long int sum = number1+number2;if (m==2){for (i=0;i<len1;i++){str_temp[h++] = str1[i];//一個一個字符處理,力求取最大的flag=0;for (j=0;j<10;j++){str_temp[h]='\0';if (strcmp(str_temp,s2[j])==0){if (i!=len1-1){strcpy(str_next,str_temp);str_next[h]=str1[i+1];str_next[h+1]='\0';for (f=0;f<10;f++){if (strcmp(str_next,s2[f])==0)//如果再取多一個字符,它是存在的//那么就選最長得那個{flag=1;break;}}}else flag = 0;if (!flag){number1 = number1*10+j;h=0;memset(str_temp,0,sizeof(str_temp));memset(str_next,0,sizeof(str_next));}}}}h=0;flag=0;memset(str_temp,0,sizeof(str_temp));memset(str_next,0,sizeof (str_next));for (i=0;i<len2;i++){str_temp[h++] = str2[i];flag=0;//記得是設置為0//剛開始就是一個沒設置為0//一直WA//0代表他再取一個字符,//str_next 不存在于s2中for (j=0;j<10;j++){str_temp[h]='\0';if (strcmp(str_temp,s2[j])==0){if (i!=len2-1){strcpy(str_next,str_temp);str_next[h]=str2[i+1];str_next[h+1]='\0';for (f=0;f<10;f++){if (strcmp(str_next,s2[f])==0){flag=1;break;}}}else flag=0;if (!flag){number2 = number2*10+j;h=0;memset(str_temp,0,sizeof(str_temp));memset(str_next,0,sizeof(str_next));}}}}pr(number1+number2,2);}else{h=0;flag=0;for (i=0;i<len1;i++){str_temp[h++] = str1[i];flag=0;for (j=0;j<10;j++){str_temp[h]='\0';if (strcmp(str_temp,s80[j])==0){if (i!=len1-1){strcpy(str_next,str_temp);str_next[h]=str1[i+1];str_next[h+1]='\0';for (f=0;f<10;f++){if (strcmp(str_next,s80[f])==0){flag=1;break;}}}else flag=0;if (!flag){number1 = number1*10+j;h=0;memset(str_temp,0,sizeof(str_temp));memset(str_next,0,sizeof(str_next));}}}}h=0;memset(str_temp,0,sizeof(str_temp));memset(str_next,0,sizeof(str_next));for (i=0;i<len2;i++){str_temp[h++] = str2[i];flag=0;for (j=0;j<10;j++){str_temp[h]='\0';if (strcmp(str_temp,s80[j])==0){if (i!=len2-1){strcpy(str_next,str_temp);str_next[h]=str2[i+1];str_next[h+1]='\0';for (f=0;f<10;f++){if (strcmp(str_next,s80[f])==0){flag=1;break;}}}else flag=0;if (!flag){number2 = number2*10+j;memset(str_temp,0,sizeof(str_temp));memset(str_next,0,sizeof(str_next));h=0;}}}}pr(number1+number2,80);}return ;
}
int main()
{int t;scanf ("%d",&t);while (t--){work();}return 0;
}
我的思路是:每個字符地處理,符合的最長串才操作。。
WA我太久了。。告訴同學們。。測試程序的話,,自己想些特殊數據,別太依賴樣例
我是用5555DEBUG出來的
轉載于:https://www.cnblogs.com/liuweimingcprogram/p/5034361.html
總結
以上是生活随笔為你收集整理的scau 9502 ARDF一个变量的问题的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。