SilentSpiral

WHUoj - 归档2

169.Digital Display

题意: 输出LCD显示屏的那种数字, 其大小由输入的第一个值确定

输入格式

第一个是数据组数
其后每行第一个值为大小, 第二个是要输出的数字串

输出格式

你猜猜

样例输入

2
2 12345
3 67890

样例输出

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
      --   --        --   
| | | | | |
| | | | | |
-- -- -- --
| | | | |
| | | | |
-- -- --

--- --- --- --- ---
| | | | | | | |
| | | | | | | |
| | | | | | | |
--- --- ---
| | | | | | | |
| | | | | | | |
| | | | | | | |
--- --- --- ---

思路

裆燃是选择查找表啦!

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
A=["- -- -----",
"|| | | |||| | |||||",
" ----- --",
"|| || | | ||| ||| |",
"- -- -- --"]

def DigPrint(rtxt,s,A):
B=[[],[],[],[],[]]
txt=[int(x) for x in rtxt]

for i in txt:
for p in range(5):
if p&1:
B[p].append(A[p][2*i]+" "*s+A[p][2*i+1])
else:
B[p].append(" "+A[p][i]*s+" ")

index=[0]+[1]*s+[2]+[3]*s+[4]
for i in index:
print(" ".join(B[i]))
print("")
return 0

n=int(input())
for _ in range(n):
s,rtxt=input().split()
s=int(s)
DigPrint(rtxt,s,A)

168. Mining

题意: 输入两张棋盘, 前者是雷, 后者是点击过的方格, 返回当前带数字显示棋盘
如果游戏结束(点到雷), 还应该在棋盘上显示所有雷的位置

输入格式

第一行是一个正整数n(n<=10)。接下来的n行表示地雷的位置。每行用n个字符表示该行的地雷:小数点表示没有地雷,星号表示有地雷。再接下来又是n行,每行仍有n个字符,点击过的方格用小写的x表示,没有点击过的用小数点表示。示例输入代表了上面的这张图。 输入文件包含了多组数据,你的程序应该一直处理到文件尾部。

输出格式

输出代表一个n*n的网格,每个位置都应填上信息:每一个被点击的但是没有地雷的位置应该用一个0到8之间的整数表示。如果一颗雷被点击,那么所有埋有地雷的位置都应显示为星号。所有其它位置应显示为小数点。如果整个过程都没有点中地雷,则不要将地雷显示出来。 每两个输出网格之前用一个空行隔开。注意最后一个网格之后没有空行。

样例输入

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
9
......*..
......*..
.........
.*.....*.
.........
*.....*..
*........
........*
..*.*....
xxxxxx...
xxxxxx...
xxxxxxx..
..xxxxx..
.xxxxxx..
.xxxxxx..
.xxxxxx..
.xxxxx...
.....x...

样例输出

1
2
3
4
5
6
7
8
9
000002*..
000002*..
1110012..
.*10001*.
.210012..
*20001*..
*200011..
.21211..*
..*.*1...

思路

计算地雷周边方格的数字是个麻烦事, 尤其边界处理
这里的方案是拿一个大一号的棋盘计算, 就不会有出界的问题了
最终输出的时候把我们要的棋盘裁下来即可

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
def mining(a,A,C):
for i in range(a):
for j in range(a):
if A[i][j]=='x':
A[i][j]=str(C[i+1][j+1])
print(''.join(A[i]))
return 0

def solve(a):
flag=0
A=[]
B=[]
for i in range(a):
A.append([x for x in input()]) #A=雷的位置
for i in range(a):
b=input()
B.append([x for x in b])
for j in range(a):
if b[j]=='x':
if A[i][j]=='.':
A[i][j]='x'
else:
flag+=1
C=[[0]*(a+2) for _ in range(a+2)]
for i in range(a):
for j in range(a):
if(A[i][j]=='*'):
C[i][j+1]+=1 #(i-1,j)上
C[i+2][j+1]+=1 #(i+1,j)下
C[i+1][j]+=1 #(i,j-1)左
C[i+1][j+2]+=1 #(i,j+1)右
C[i][j]+=1 #(i-1,j-1)左上
C[i+2][j+2]+=1 #(i+1,j+1)右下
C[i+2][j]+=1 #(i+1,j-1)左下
C[i][j+2]+=1 #(i-1,j+1)右上
if flag:
mining(a,A,C)
else:
mining(a,B,C)
return 0

a=int(input())
solve(a)

while True:
try:
a=int(input())
print()
solve(a)
except EOFError:
break

164. Back To DOS

题意: 模拟dos的目录切换

题目中的CD命令有以下四种:

  1. CD .. ->回到父目录(上级目录),若原先在根目录,则仍然在根目录。
    CD 与..之间可以有0个、1个或多个空格
  2. CD  ->回到根目录( 根目录为A:, B:, …, Z: )
  3. CD DIRECTION ->跳到当前目录的名为DIRECTION的子目录。
    CD与DIRECTION 之间的空格可以有一个或多个。
  4. CD ->跳到根目录下的名为DIRECTION的目录。
    CD与0 个、1个或多个空格,但。

输入格式

输入的第一行为初始目录,目录中不含空格,第二行为整数N,表示接下来有N行CD命令,每行命令都不以空格开头,也不以空格结束。

为简单起见,我们假设所给的目录都存在,且目录名只含大写字母。单个目录名的长度为1-8,每行CD命令的长度最多为80个字符,初始目录长度最多为80个字符,结果目录长度最多为200个字符。处理到文件结束。

输出格式

对于每一组CD命令,输出格式为:

Case n
最终目录

每输出一个CASE后,输出一行空行(最后一个CASE后也输出空行)。注意,最终目录不含空格!

样例输入

1
2
3
4
5
6
7
8
9
10
11
12
13
A:\
2
CD..
CD ..

C:\WINDOWS\SYSTEM\
2
CD NET
CD COM\DCOM

C:\PCTOOLS\
1
CD \WPS\FONT

样例输出

1
2
3
4
5
6
7
8
Case 1
A:\

Case 2
C:\WINDOWS\SYSTEM\NET\COM\DCOM\

Case 3
C:\WPS\FONT\

思路

大概是一个…栈?
python的字符串处理对付这种题目还算是顺手的
不知道如果是c的话要不要写个状态机?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
cnt=0
while True:
try:
a=input()
if a:
cnt+=1
l=int(input())
a=a.replace("\\"," ")
a=a.split()
pan=a.pop(0)
for i in range(l):
d=input()
if d:
d=d[2:]
tmp=d.replace(" ","")
d=d.replace("\\"," ")
d=d.split()
if tmp[0]=="\\":
a=d
elif d[0]=='..':
if(len(a)):
a.pop()
else:
a+=d
print("Case",cnt)
if(len(a)):
print(pan+"\\"+'\\'.join(a)+'\\\n')
else:
print(pan+'\\\n')
except EOFError:
break

351. Olympic

题意: 帝都奥运会人力倒计时

输入格式

第一行数据个数
其后每行是月和日
样例就不给了

输出格式

你猜猜

思路

手工制表

1
2
3
4
5
6
7
A=[31 ,29 ,31  ,30,31,30,31,8]
B=[190,161,130,100,69,39,8 ,0]
a=int(input())
for _ in range(a):
month,day=map(int,input().split())
rest=B[month-1]+A[month-1]-day
print(rest)

65.2D Path Problem

题意: 输入是一串轨迹, 从原点出发, R则向右, U则向上, 轨迹终点与起点连线, 围成的闭曲线中, 处于连线下方的权值为正, 连线上方权值为负, 求其带权面积

输入格式

第一行数据组数
余下每行皆是形如“RRURRUUURRRRRUUR”的路径

输出格式

输出浮点数, 保留小数点后3位

思路

折线左上侧面积减折线右下侧面积除以2

1
2
3
4
5
6
7
8
9
10
11
12
13
14
n=int(input())
for i in range(n):
a=input()
weight=a.count('R')
height=a.count('U')
area=weight*height
tmpw=weight
tmparea=0
for p in a:
if p=='U':
tmparea+=tmpw
else:
tmpw-=1
print('%.03f'%((area-2*tmparea)/2))

101. Kittig

题意: 如下图在二维空间里,平行于X轴和平行于Y轴的直线把平面分成了一个一个的方格。
(图被我吃了, 诸位自行脑补) kittig在方格线上走,有四种走法:向上,下,左,右,一步是一个单位。设kittig的初始位置在A(X,Y),问在N步后kittig停在B(X,Y)处,kittig有多少种走法。

输入格式

首先是一个整数T(T<=50)表示这组数据中有T个CASE 。接下来有T行,每行一个CASE。 每个CASE 由五个整数组成,x1,y1,x2,y2,N. (-263 < x1,y1,x2,y2 < 263; 0 ≤ N < 263) 分别代表A点坐标和B点坐标。N表示kittig从A走到B的步数。

输出格式

每个CASE 输出一个整数ans(0 ≤ ans ≤ 263-1),表示kittig从A到B用N步的走法。

思路

消序法消序法消序法消序法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
from math import factorial
T=int(input())
for i in range(T):
x1,y1,x2,y2,N=[int(x) for x in input().split()]
A=abs(x1-x2)
B=abs(y1-y2)
K=N-A-B
if(K&1):
print(0)
else:
K=K>>1
ans=0
tmp=factorial(N)
for a in range(K+1):
b=K-a
ans+=tmp//(factorial(A+a)*factorial(B+b)*factorial(a)*factorial(b))
print(ans)
打赏