2023年藍橋杯預賽第十題加密

2021-10-02 11:08:51 字數 2150 閱讀 3120

題目:一種playfair密碼變種加密方法如下:首先選擇乙個金鑰單詞(稱為pair)(字母不重複,且都為小寫字母),然後與字母表中其他字母一起填入至乙個5x5的方陣中,填入方法如下:

1.首先按行填入金鑰串。

2.緊接其後,按字母序按行填入不在金鑰串中的字母。

3.由於方陣中只有25個位置,最後剩下的那個字母則不需變換。

如果金鑰為youandme,則該方陣如下: 

y o u a n

d m e b c

f g h i j

k l p q r

s t v w x

在加密一對字母時,如am,在方陣中找到以這兩個字母為頂點的矩形(紅色字型):

y o u a n

d m e b c

f g h i j

k l p q r

s t v w x

這對字母的加密字母為該矩形的另一對頂點,如本例中為ob。

請設計程式,使用上述方法對輸入串進行加密,並輸出加密後的串。

另外有如下規定:

1、一對一對取字母,如果最後只剩下乙個字母,則不變換,直接放入加密串中;

2、如果一對字母中的兩個字母相同,則不變換,直接放入加密串中;

3、如果一對字母中有乙個字母不在正方形中,則不變換,直接放入加密串中;

4、如果字母對出現在方陣中的同一行或同一列,如df或hi,則只需簡單對調這兩個字母,即變換為fd或ih;

5、如果在正方形中能夠找到以字母對為頂點的矩形,假如字母對為am,則該矩形的另一對頂點字母中,與a同行的字母應在前面,在上例中應是ob;同樣若待變換的字母對為ta,則變換後的字母對應為wo;

6、本程式中輸入串均為小寫字母,並不含標點、空格或其它字元。

解密方法與加密相同,即對加密後的字串再加密,將得到原始串。

要求輸入形式如下:

從控制台輸入兩行字串,第一行為金鑰單詞(長度小於等於25),第二行為待加密字串(長度小於等於50),兩行字串末尾都有乙個回車換行符,並且兩行字串均為小寫字母,不含其它字元。

在標準輸出上輸出加密後的字串。

例如,若輸入:

youandme

welcometohangzhou

則表示輸入的金鑰單詞為youandme,形成的正方形如上所示;待加密字串為welcometohangzhou。在正方形中可以找到以第一對字母we為頂點的矩形,對應另一對頂點字母為vb,因此加密後為vb,同理可找到與字母對lc,et,oh,ho對應的頂點字母對。而字母對om位於上述正方形中的同一列,所以直接以顛倒這兩個字母來加密,即為mo,字母對an同理。字母對gz中的z不在上述正方形中,因此原樣放到加密串中。最後剩乙個字母u也原樣輸出。

因此輸出的結果為:

vbrmmomvugnagzguu

要求考生把所有函式寫在乙個檔案中。除錯好後,存入與考生資料夾下對應題號的「解答.txt」中即可。相關的工程檔案不要拷入。

對於程式設計題目,要求選手給出的解答完全符合ansi c標準,不能使用c++特性;不能使用諸如繪圖、中斷呼叫等硬體相關或作業系統相關的api。

解題思路:先生成對應二維矩陣儲存字母,再根據給出條件對兩個相鄰字元進行操作輸出。

#include#includeusing namespace std;

string key, instr;

int cnt = 1, position[30]; //position[acs] acs為字母的ascii碼, position[acs]為該字母的位置資訊

char alpha[5][5]; //(position[acs]-1)/5 為行, (position[acs]-1)%5為列

int main()

for(int i=0; i<26; ++i)

if(position[i] == 26)

alpha[(position[i]-1)/5][(position[i]-1)%5] = i+'a'; }

int len = instr.length(), lens;

lens = len;

if(len & 1)

for(int i=0; iif(lens != len)

return 0;

}

第三屆藍橋杯本科預賽 c 第十題

今盒子裡有n個小球,a b兩人輪流從盒中取球,每個人都可以看到另乙個人取了多少個,也可以看到盒中還剩下多少個,並且兩人都很聰明,不會做出錯誤的判斷。我們約定 每個人從盒子中取出的球的數目必須是 1,3,7或者8個。輪到某一方取球時不能棄權!a先取球,然後雙方交替取球,直到取完。被迫拿到最後乙個球的一...

2023年藍橋杯B組c c 第十題詳解

給定n個整數a1,a2,an。請你從中選出k個數,使其乘積最大。請你求出最大的乘積,由於乘積可能超出整型範圍,你只需輸出乘積除以1000000009的餘數。注意,如果x 0,我們定義x除以1000000009的餘數是負 x 除以1000000009的餘數。即 0 0 x 1000000009 第一行...

2017藍橋杯第十題k倍區間

給定乙個長度為n的數列,a1,a2,an,如果其中一段連續的子串行ai,ai 1,aj i j 之和是k的倍數,我們就稱這個區間 i,j 是k倍區間。你能求出數列中總共有多少個k倍區間嗎?輸入 第一行包含兩個整數n和k。1 n,k 100000 以下n行每行包含乙個整數ai。1 ai 100000 ...