閱讀967 返回首頁    go 阿裏雲 go 技術社區[雲棲]


UVA之10878 - Decode the tape

【題目】

Your boss has just unearthed a roll of old computer tapes. The tapes have holes in them and might contain some sort of useful information. It falls to you to figure out what is written on them.

Input
The input will contain one tape.

Output
Output the message that is written on the tape.

Sample Input Sample Output
___________
| o   .  o|
|  o  .   |
| ooo .  o|
| ooo .o o|
| oo o.  o|
| oo  . oo|
| oo o. oo|
|  o  .   |
| oo  . o |
| ooo . o |
| oo o.ooo|
| ooo .ooo|
| oo o.oo |
|  o  .   |
| oo  .oo |
| oo o.ooo|
| oooo.   |
|  o  .   |
| oo o. o |
| ooo .o o|
| oo o.o o|
| ooo .   |
| ooo . oo|
|  o  .   |
| oo o.ooo|
| ooo .oo |
| oo  .o o|
| ooo . o |
|  o  .   |
| ooo .o  |
| oo o.   |
| oo  .o o|
|  o  .   |
| oo o.o  |
| oo  .  o|
| oooo. o |
| oooo.  o|
|  o  .   |
| oo  .o  |
| oo o.ooo|
| oo  .ooo|
|  o o.oo |
|    o. o |
___________
A quick brown fox jumps over the lazy dog.


Problemsetter: Igor Naverniouk

Special thanks: BSD games ppt.

【解析】

輸入從上往下看,可以看成題目所說的一段磁帶。
題目給的信息很少,因此大部分信息要從輸入輸出得到。
(相當於給你一段明文跟密碼,然後你破解其中的加密規則)


首先我們發現,磁帶一共有43行,跟密碼的字符個數一樣(換行包括在內)。
可以猜測是否磁帶的一行,代表一個字符。
然後我們可以發現,密碼中相同的字符,在磁帶裏麵的對應行,也是相同的。
更加堅定我們的猜測。


然後我們觀察磁帶裏每行的結構。
其整體的格式一樣,隻有 “o” 的位置和數量有不同。
而且 “o” 隻會在固定的7個位置出現。
則 7 個位置,一共可以表示出 2^7=128 種字符。
聯係字符的整型特征(ASCII碼),
可以猜測,磁帶的每行表示著一個二進製數,這個二進製數的數值正好是對應字符的ASCII碼。


看一下空格(ASCII碼為32)的對應行 “ o  .   ”,
把行中的空格看作0,“o” 看作1,則可以得到二進製數0100000,正好是32。
破譯完畢。

【代碼】

  1. /********************************* 
  2. *   日期:2013-5-3 
  3. *   作者:SJF0115 
  4. *   題號: 10878 - Decode the tape 
  5. *   來源:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=20&page=show_problem&problem=1819 
  6. *   結果:AC 
  7. *   來源:UVA 
  8. *   總結: 
  9. **********************************/  
  10. #include <stdio.h>  
  11. #include <string.h>  
  12.   
  13. int c[] = { 0, 0, 64, 32, 16, 8, 0, 4, 2, 1, 0};  
  14.   
  15. int main() {  
  16.     char str[15];  
  17.     int value,i;  
  18.     //freopen("C:\\Users\\XIAOSI\\Desktop\\acm.txt","r",stdin);     
  19.     gets(str);  
  20.     while(gets(str) && str[0] != '_'){  
  21.         value = 0;  
  22.         int len = strlen(str);  
  23.         for(i = 2;i < len;i++){  
  24.             if(str[i] == 'o'){  
  25.                 value += c[i];  
  26.             }  
  27.         }  
  28.         printf("%c",value);  
  29.     }  
  30. }  

最後更新:2017-04-03 12:56:27

  上一篇:go UVA之409 - Excuses, Excuses!
  下一篇:go Windows控製台下繪製簡單圖形