OJ : The Hardest Problem Ever

目录

1.题目

2.中文翻译

3.思路分析

4.代码

5.coding而知新


1.题目

                                                        The Hardest Problem Ever

Problem Description

        Julius Caesar lived in a time of danger and intrigue. The hardest situation Caesar ever faced was keeping himself alive. In order for him to survive, he decided to create one of the first ciphers. This cipher was so incredibly sound, that no one could figure it out without knowing how it worked.
        You are a sub captain of Caesar's army. It is your job to decipher the messages sent by Caesar and provide to your general. The code is simple. For each letter in a plaintext message, you shift it five places to the right to create the secure message (i.e., if the letter is 'A', the cipher text would be 'F'). Since you are creating plain text out of Caesar's messages, you will do the opposite:

        Cipher text
        A B C D E F G H I J K L M N O P Q R S T U V W X Y Z

        Plain text
        V W X Y Z A B C D E F G H I J K L M N O P Q R S T U

        Only letters are shifted in this cipher. Any non-alphabetical character should remain the same, and all alphabetical characters will be upper case.

Input

        Input to this problem will consist of a (non-empty) series of up to 100 data sets. Each data set will be formatted according to the following description, and there will be no blank lines separating data sets. All characters will be uppercase.

        A single data set has 3 components:

        Start line - A single line, "START"

        Cipher message - A single line containing from one to two hundred characters, inclusive, comprising a single message from Caesar

        End line - A single line, "END"

        Following the final data set will be a single line, "ENDOFINPUT".

Output

        For each data set, there will be exactly one line of output. This is the original message by Caesar.

Sample Input

START

NS BFW, JAJSYX TK NRUTWYFSHJ FWJ YMJ WJXZQY TK YWNANFQ HFZXJX

END

START

N BTZQI WFYMJW GJ KNWXY NS F QNYYQJ NGJWNFS ANQQFLJ YMFS XJHTSI NS WTRJ

END

START

IFSLJW PSTBX KZQQ BJQQ YMFY HFJXFW NX RTWJ IFSLJWTZX YMFS MJ

END

ENDOFINPUT

Sample Output

IN WAR, EVENTS OF IMPORTANCE ARE THE RESULT OF TRIVIAL CAUSES

I WOULD RATHER BE FIRST IN A LITTLE IBERIAN VILLAGE THAN SECOND IN ROME

DANGER KNOWS FULL WELL THAT CAESAR IS MORE DANGEROUS THAN HE

2.中文翻译

有史以来最棘手的问题

题目描述

        尤利乌斯·凯撒生活在一个充满危险和阴谋的时代。凯撒所面临的最艰难的处境就是保住自己的性命。为了让他活下来,他决定创造第一批密码之一。这个密码非常可靠,没有人能在不知道它是如何工作的情况下弄清楚它。

        你是凯撒军队的副队长。你的工作是破译凯撒发送的信息并提供给你的将军。代码很简单。对于明文消息中的每个字母,您将其向右移动五位以创建安全消息(即,如果字母是“a”,则密文将是“F”)。既然你是在凯撒的信息中创建纯文本,你需要翻译凯撒密码:

        密码文本

        A B C D E F G H I J K L M N O P Q R S T U V W X Y Z

        纯文本

        V W X Y Z A B C D E F G H I J K L M N O P Q R S T U

        这个密码只有字母移位。任何非字母字符都应该保持不变,所有字母字符都是大写。

输入

        此问题的输入将由一系列(非空)多达100个数据集组成。每个数据集都将根据以下描述进行格式化,并且不会有分隔数据集的空行。所有字符均为大写。

        单个数据集包含3个组件:

                起始行-单行“Start”

                密码信息-包含一到两百个字符的单行,包括凯撒的一条信息

                结束线-单行,“End”

                最后的数据集后面将是一行,“ENDOFINPUT”。

输出

        对于每个数据集,将恰好有一行输出。这是凯撒的原始信息。

标准输入

START
NS BFW, JAJSYX TK NRUTWYFSHJ FWJ YMJ WJXZQY TK YWNANFQ HFZXJX
END
START
N BTZQI WFYMJW GJ KNWXY NS F QNYYQJ NGJWNFS ANQQFLJ YMFS XJHTSI NS WTRJ
END
START
IFSLJW PSTBX KZQQ BJQQ YMFY HFJXFW NX RTWJ IFSLJWTZX YMFS MJ
END
ENDOFINPUT

标准输出

IN WAR, EVENTS OF IMPORTANCE ARE THE RESULT OF TRIVIAL CAUSES
I WOULD RATHER BE FIRST IN A LITTLE IBERIAN VILLAGE THAN SECOND IN ROME
DANGER KNOWS FULL WELL THAT CAESAR IS MORE DANGEROUS THAN HE

3.思路分析

  1. 补充知识: “ A的ASCII码是65,a的ASCII码是97 ”。
  2. 现在英文(English)所基于的字母,共26个 : 所以A~Z对应的assic码的值:65~97
  3. 仔细观察凯撒密码表和平凡密码表:一定注意字母之间的对应关系:关系如下
#x表示凯撒密码(和题目相对应,分别按顺序对应26个字母)
char x[]={'V','W','X','Y','Z','A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U'};
#a是存储凯撒密码表示的字符串(也就是输入的字符串),下面的意思就是翻译修改a[i],因为最后还是打印输出a,但是此时打印输出的a是翻译过后的a
a[i]=x[a[i]-'A'];

4.代码

#encoding=utf-8
#outputlist用来保存编译后的密码集合
outputlist=[]

#X表示凯撒密码
X=['V','W','X','Y','Z','A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U']

#主程序
while(True):
    #a接受第一个信号:比如START
    a=input()
    if a[0]=="E":
        break
    else:
        #b接收密码文本信号
        b=input()

        #c接收第三个信号:比如END
        c=input()

        lenstrb=int(len(b))
        #因为在python中字符串是不可变类型,所以需要把字符串转换成list进行操作
        listb=list(b)

        for i in range(lenstrb):
            #标点符号和空格列表元素保持不变
            if listb[i]==" " or listb[i]=="," or listb[i]=="." or listb[i]=="!" or listb[i]=="?":
                listb[i]=listb[i]
            #翻译密码
            else:
                listb[i]=X[ord(listb[i])-ord("A")]

        outputlist.append(listb)
#依次打印每个密码文本
for i in outputlist:
    for j in i:
        print(j,end="")
    print()

5.coding而知新

1.思路代码(有错误):

X=['V','W','X','Y','Z','A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U']
while(True):
    a=input()
    if a[0]=="E":
        break
    else:
        b=input()
        c=input()
        for i in b:
            i=X[ord(i)-ord("A")]

 上面的错误是因为没有进行字符段空格或者标点符号的排除,list在直接使用空格或者标点符号作为下标的时候会导致 list index out of range的错误。

2.python怎么做ascii码的减法运算

        ASCII 码是一种将字符映射成数字的编码方式,每个字符都有自己对应的 ASCII 码值。在 Python 中,可以通过内置函数 ord() 获得一个字符的 ASCII 码值,chr() 函数将一个 ASCII 码值转换为对应的字符。

        要进行 ASCII 码的减法运算,首先需要将两个字符分别转换为对应的 ASCII 码值,然后将这两个 ASCII 码值作差,最后再用 chr() 将结果转换回对应的字符。例如:

char1 = 'd'
char2 = 'a'
diff = ord(char1) - ord(char2)
print(diff)  # 输出:3

        这里从字符 'd' 对应的 ASCII 码值(100)中减去了字符 'a' 对应的 ASCII 码值(97),得到的差为 3。如果要将这个差值转换回对应的字符,可以使用如下代码:

result = chr(ord(char1) - ord(char2))
print(result)  # 输出:'\x03'

        这里的 \x03 是一个控制字符,代表 ASCII 码值为 3 的字符,它是不可打印字符,因此输出时会以转义字符的形式显示出来。

3.'str' object does not support item assignment

        这个错误通常发生在试图修改字符串中某一个字符时。需要注意的是,Python 中的字符串属于不可变对象(immutable object),也就是说,一旦创建,就不能被修改。

        要解决这个问题,需要使用其他方法来实现所需的修改操作,而不能直接在原字符串上进行修改。一种常见的方法是将字符串转换为列表(list)类型,然后进行修改操作,最后将列表转换回字符串

        例如:

s = "hello"
lst = list(s)
lst[0] = "H"  # 将第一个字符改为大写字母
new_s = "".join(lst)  # 将列表转换回字符串
print(new_s)  # 输出 "Hello"

4.python代码用于打印列表中的列表,怎么让列表中的的列表分行打印?

# 依次打印每个密码文本
for i in outputlist:
    for j in i:
        print(j, end="")
    # 在内部循环结束后输出一个换行符
    print()

        这里我们在每次内部循环结束后输出一个换行符,这会让下一轮循环从新的一行开始打印。这样修改之后,原来连续的所有密码文本都会被分成多行打印,每行只包含一个密码文本。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: swustoj493: postoffice 这个问题不是很清楚,不知道您想要什么样的回答。如果您是想问西南科技大学的oj系统中的题目编号为swustoj493的题目是什么,那么这道题目是关于模拟邮局的题目,需要模拟邮局的业务流程,包括寄信、收信、查询等操作。如果您有其他问题,请具体说明。 ### 回答2: swustoj493是一个在线评测系统,主要用于程序设计竞赛和编程练习。其中postoffice是一道题目,大致描述如下: 假设你现在是一个邮差,需要给不同地点的人分发信件。你可以驾驶一辆汽车,汽车每次可以行驶d距离,需要从邮局出发,然后依次到达所有的收件人所在的位置,最终回到邮局。每个收件人的位置以及他们的信息都已知,你需要根据他们的需求,按照最优的顺序依次分配邮件,保证每个人都能及时收到自己的信件。 这个问题实际上是TSP问题(旅行售货员问题)的一种变体。TSP问题的目标是找到一条路径,使得经过所有的点并回到起点,总路程最短。而postoffice问题则是在TSP问题的基础上增加了一些限制,使得问题更加复杂。 解决这个问题的方法主要有两种:暴力枚举和近似算法。暴力枚举法可以穷尽所有可能的路径,但时间复杂度会随着点数的增加呈指数级增长,不适合应用于大规模数据。而近似算法则可以在合理的时间内快速求解问题,但得到的路径并不一定是最优解。 在编程实现时,可以采用图论的思路,利用邻接矩阵或邻接表来表示点之间的关系,然后使用动态规划、贪心等算法来求解。此外,还可以结合优化算法如模拟退火、遗传算法、粒子群优化等来进一步提高算法的效率。 总的来说,postoffice问题是一个难度较高的数学问题,需要较高的抽象思维、编程技巧以及优化算法知识,同时也是一个很好的练手题目。 ### 回答3: SWUSTOJ493: postoffice是一个计算机程序设计考试题目,该题目是一个基于图论算法的问题。题目描述如下: 你的任务是帮助快递公司规划一条最短的路线,使得每个邮局都可以被访问到。假设有$n$个邮局和$m$条道路,每个邮局有一个编号$1\sim n$,并且每个道路有一个长度$l_i$,连接着两个邮局$x_i$和$y_i$。 为了简化问题,我们假设每个道路都是双向的,且两个邮局之间只有一条道路相连。快递员可以从任一邮局出发,但必须返回原始的起点才算完成任务。 你需要设计一个算法来寻找一条最短的路线,使得经过的邮局数量最大,输出所经过的邮局数量即可。 对于这道题目,我们可以采用Dijkstra算法,首先将所有的邮局看作一个个节点,然后建立邮局之间的道路连接,根据Dijkstra算法的特点,每次会寻找距离起点最近的节点,我们可以在算法的过程中记录下它经过的邮局数量,最终输出经过邮局数量最大的那条路径及经过的邮局数量即可。 例如,在图中点集为$V=\{1,2,3,4,5\}$,边集为$E=\{(1,2,1),(1,3,2),(2,3,2),(2,4,3),(2,5,5),(3,5,4),(4,5,1)\}$,其中(1,2,1)表示点1和点2之间有一条长度为1的边,求所经过的邮局数量最大的最短路经过的邮局数量为3,即起点到达2、3、5这三个节点。 因此,对于SWUSTOJ493: postoffice考试题目,我们只需要利用Dijkstra算法,按照题目要求,记录经过的邮局数量最大的路径即可。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值