1. 程式人生 > >第13屆景馳-埃森哲杯廣東工業大學ACM程式設計大賽 K 密碼

第13屆景馳-埃森哲杯廣東工業大學ACM程式設計大賽 K 密碼

題目描述

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;
}