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是測向新手,對于辨別信號,信號源定位等方法都不太熟悉?,F在,又到訓練時間了。教練讓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; }?
轉載于:https://www.cnblogs.com/liaoguifa/archive/2012/11/22/2782517.html
總結
以上是生活随笔為你收集整理的SCAU 9502 ARDF的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 区块链技术在金融行业的应用
- 下一篇: 综评计算机考试范围,高考565分上海考生