第13屆景馳-埃森哲杯廣東工業大學ACM程式設計大賽 K 密碼
阿新 • • 發佈:2019-02-20
題目描述
ZiZi登入各種賬號的時候,總是會忘記密碼,所以他把密碼都記錄在一個記事本上。其中第一個密碼就是牛客網的密碼。牛客網專注於程式設計師的學習、成長及職位發展,連線C端程式設計師及B端招聘方,通過IT筆試面試題庫、線上社群、線上課程等提高候選人的求職效率,通過線上筆試、面試及其他工具提升企業的招聘效率。
團隊由來自Google、百度、阿里、網易等知名網際網路巨頭的熱血技術青年組成,使用者覆蓋全國2000多所高校的100W求職程式設計師及全部一線網際網路企業,並仍在高速增長中。
謹慎的ZiZi當然不會直接把密碼記錄在上面,而是把上面的字串經過轉化後才是真正的密碼。轉化的規則是把字串以n行鋸齒形寫出來,然後再按從左到右,從上到下讀取,即為真正的密碼。如ABABCADCE以3行寫出:
所以真正的密碼是ACEBBACAD。但是每一次都要寫出來就太麻煩了,您如果能幫他寫出一個轉換程式,他就送你一個氣球。
輸入描述:
第一行一個整數T,表示資料組數 對於每組資料,首先一個正整數n(n<=100,000),然後下一行為一個字串,字串長度len<=100,000。
輸出描述:
對於每組資料,輸出一個字串,代表真正的密碼。示例1
輸入
1 3 ABABCADCE
輸出
ACEBBACAD思路:這是找規律的題目,先畫出圖可以發現:第1行和n行,下標一直是2 *(n - 1)。第2行和n-1行,字元下標先加2 *(n - i)再加2 *(i-1)兩個一組然後迴圈。
#include<iostream> #include<string.h> using namespace std; const int inf = 100005; int main() { int t,n,index = 0; char data[inf]; cin>>t; while(t--) { cin>>n>>data; if(n == 1) cout<<data<<endl; else { int len = strlen(data); for(int i = 1; i <= n; i++) { if(i == 1 || i == n) { index = i - 1; while(index < len) { cout<<data[index]; index += 2 * (n - 1); } } else { index = i - 1; while(index < len) { cout<<data[index]; index += 2 * (n - i); if(index >= len) break; //防止溢位 cout<<data[index]; index += 2 * (i-1); } } } cout<<endl; } } return 0; }