close
Content

I I U P C   2 0 0 9

上一屆的 IIUPC 有一題「達文西密碼」是以丹布朗的暢銷書「達文西密碼」為故事背景。這一題則是以科技驚悚小說「數位堡壘」為背景。題目給你一個密文,你要用下述的解碼方式來解碼。比如說,如果密文如下:
WECGEWHYAAIORTNU
輸出則是:
WEAREWATCHINGYOU

上例中所給的密文 "WECGEWHYAAIORTNU" 有 16 個字元,也就是 4 的平方。請把這些字元以「列優先」(row major,第一列放滿後再放第二列,再第三列……) 的方式置入一個 n ´ n (本例為 4 ´ 4) 的格子。本例密文放置完成後的格子如下:
W E C G
E W H Y
A A I O
R T N U

當我們以「行優先」(column major,取完第一行再取第二行,然後第三行) 的方式將上面格子的字元取出便可以得到以下的明文:
WEAREWATCHINGYOU

Input
輸入的第一行有一個數字 T,接著有 T 筆測資,每筆測資一行,該行便是要處理的密文。密文僅包含大寫字母及空白。密文的總字元數不會超過 10,000。
Output
相對於每筆測資,請將明文輸出於一行。若輸入的字元數不是完全平方數,請輸出「INVALID」。
Sample Input #1
3
WECGEWHYAAIORTNU
DAVINCICODE
DTFRIAOEGLRSI TS
Sample Output #1
WEAREWATCHINGYOU
INVALID
DIGITAL FORTRESS
測資資訊:
記憶體限制: 512 MB
公開 測資點#0 (100%): 1.0s , <1K

C++

#include <iostream>
#include <math.h>

using namespace std;
  
int main() {
    int t;
	string s;
	cin>>t;
	getline(cin,s);
	while (t--)
	{
		getline(cin,s);
		int sq=sqrt(s.size()); //sqrt(s.size())  開平方
		if (sq*sq!=s.size())
		{
			cout<<"INVALID\n";
			continue;
		}
		for (int col = 0; col < sq; col++){
            for (int row = 0; row < sq; row++){
                cout << s[row * sq + col];
            }
        }
		cout<<"\n";
	}
	
    return 0;
}

python:

import math
n = int(input())
for i in range(n):
    s = input()[::1]
    sq=int(math.sqrt(len(s)))
    
    if sq**2!=len(s):print("INVALID");continue
    for i in range(sq):
        for j in range(sq):
            print(s[j*sq+i],end='')
    print()

arrow
arrow
    文章標籤
    高中生程式解題 python C++
    全站熱搜
    創作者介紹
    創作者 趴趴熊日常 的頭像
    趴趴熊日常

    資工趴趴熊的小天地

    趴趴熊日常 發表在 痞客邦 留言(0) 人氣()