数组输入:
可以提前定义
a = [0for i inrange(1000)]
或者
arr = list(map(int,input().split()))
输出
import math
pi = math.pi
p = -1*pi
print(pi)
print('%.4f' % pi)
# 2,前面补充前导0表示月份
a = 2# 2月输出02
b = 11# 11月输出11print('%02d' % a)
print('%02d' % b)
print('%d %d' % (a,b))
dfs与bfs
X星球的一处迷宫游乐场建在某个小山坡上。
它是由10x10相互连通的小房间组成的。
房间的地板上写着一个很大的字母。
我们假设玩家是面朝上坡的方向站立,则:
L表示走到左边的房间,
R表示走到右边的房间,
U表示走到上坡方向的房间,
D表示走到下坡方向的房间。
X星球的居民有点懒,不愿意费力思考。
他们更喜欢玩运气类的游戏。这个游戏也是如此!
开始的时候,直升机把100名玩家放入一个个小房间内。
玩家一定要按照地上的字母移动。
迷宫地图如下:
UDDLUULRUL
UURLLLRRRU
RRUURLDLRD
RUDDDDUUUU
URUDLLRRUU
DURLRLDLRL
ULLURLLRDU
RDLULLRDDD
UUDDUDUDLL
ULRDLUURRR
# 每个方块有一名玩家# 大暴力不叫dfsdefdfs(x,y):
global ans
whileTrue:
if x>9or x<0or y>9or y<0:
ans += 1breakif vis[x][y]==1:
break
vis[x][y]=1if mp[x][y]=='U':
x-=1elif mp[x][y]=='D':
x+=1elif mp[x][y]=='L':
y-=1elif mp[x][y]=='R':
y+=1definit():
for i inrange(10):
for j inrange(10):
vis[i][j]=0
mp = [''for i inrange(10)]
for i inrange(10):
mp[i] = input()
ans = 0
vis = [[0]*10for i inrange(10)]
for i inrange(10):
for j inrange(10):
init()
dfs(i,j)
print(ans)
农夫约翰有一片 N∗M 的矩形土地。
最近,由于降雨的原因,部分土地被水淹没了。
现在用一个字符矩阵来表示他的土地。
每个单元格内,如果包含雨水,则用”W”表示,如果不含雨水,则用”.”表示。
现在,约翰想知道他的土地中形成了多少片池塘。
每组相连的积水单元格集合可以看作是一片池塘。
每个单元格视为与其上、下、左、右、左上、右上、左下、右下八个邻近单元格相连。
请你输出共有多少片池塘,即矩阵中共有多少片相连的”W”块。
输入格式
第一行包含两个整数 N 和 M。
接下来 N 行,每行包含 M 个字符,字符为”W”或”.”,用以表示矩形土地的积水状况,字符之间没有空格。
输出格式
输出一个整数,表示池塘数目。
数据范围
1≤N,M≤1000
输入样例:
1012
W........WW.
.WWW.....WWW
....WW...WW.
.........WW.
.........W..
..W......W..
.W.W.....WW.
W.W.W.....W.
.W.W......W.
..W.......W.
输出样例:
3
n,m = list(map(int,input().split()))
mp = [''for i inrange(1000)]
vis = [[0]*1000for i inrange(1000)]
dx=[0,0,1,-1,1,1,-1,-1]
dy=[1,-1,0,0,1,-1,1,-1]
defbfs(x,y):
q = []
t = [x,y]
q.append(t)
vis[x][y]=1whilelen(q)>0:
t=q[0]
q.pop(0)
for i inrange(8):
tx = dx[i]+t[0]
ty = dy[i]+t[1]
if tx>=0and tx<n and ty>=0and ty<m and vis[tx][ty]==0and mp[tx][ty]=='W':
z = [tx,ty]
q.append(z)
vis[tx][ty]=1for i inrange(n):
mp[i] = input()
ans = 0for i inrange(n):
for j inrange(m):
if vis[i][j]==0and mp[i][j]=='W':
bfs(i,j)
ans+=1print(ans)
一天Extense在森林里探险的时候不小心走入了一个迷宫,迷宫可以看成是由 n∗n 的格点组成,每个格点只有2种状态,.和#,前者表示可以通行后者表示不能通行。
同时当Extense处在某个格点时,他只能移动到东南西北(或者说上下左右)四个方向之一的相邻格点上,Extense想要从点A走到点B,问在不走出迷宫的情况下能不能办到。
如果起点或者终点有一个不能通行(为#),则看成无法办到。
注意:A、B不一定是两个不同的点。
输入格式
第1行是测试数据的组数 k,后面跟着 k 组输入。
每组测试数据的第1行是一个正整数 n,表示迷宫的规模是 n∗n 的。
接下来是一个 n∗n 的矩阵,矩阵中的元素为.或者#。
再接下来一行是 4 个整数 ha,la,hb,lb,描述 A 处在第 ha 行, 第 la 列,B 处在第 hb 行, 第 lb 列。
注意到 ha,la,hb,lb 全部是从 0 开始计数的。
输出格式
k行,每行输出对应一个输入。
能办到则输出“YES”,否则输出“NO”。
数据范围
1≤n≤100
输入样例:
23
.##
..##..00225
.....
###.#
..#..###..
...#.0040
输出样例:
YES
NO
t = int(input())
mp = [''for i inrange(100)]
vis = [[0]*100for i inrange(100)]
dx = [0,0,1,-1]
dy = [1,-1,0,0]
defbfs(x,y):
k = [x,y]
q = []
q.append(k)
vis[x][y]=1whilelen(q)>0:
k = q.pop(0)
if k[0]==ex and k[1]==ey:
returnTruefor i inrange(4):
tx = dx[i]+k[0]
ty = dy[i]+k[1]
if tx>=0and tx<n and ty>=0and ty<n and vis[tx][ty]==0and mp[tx][ty]=='.':
z = [tx,ty]
# print(z)
q.append(z)
vis[tx][ty]=1returnFalsedefinit(n):
for i inrange(n):
for j inrange(n):
vis[i][j]=0for i inrange(t):
n = int(input())
for i inrange(n):
mp[i] = input()
x,y,ex,ey = list(map(int,input().split()))
init(n)
if bfs(x,y)==Trueand mp[x][y]!='#':
print('YES')
else:
print('NO')
t = int(input())
mp = [''for i inrange(100)]
vis = [[0]*100for i inrange(100)]
dx = [0,0,1,-1]
dy = [1,-1,0,0]
defdfs(x,y):
if mp[x][y]=='#':
returnFalseif x==ex and y==ey:
returnTrue
vis[x][y]=1for i inrange(4):
tx = x+dx[i]
ty = y+dy[i]
if tx>=0and tx<n and ty>=0and ty<n and vis[tx][ty]==0and mp[tx][ty]=='.':
if dfs(tx,ty):
returnTruereturnFalsedefinit(n):
for i inrange(n):
for j inrange(n):
vis[i][j]=0for i inrange(t):
n = int(input())
for i inrange(n):
mp[i] = input()
x,y,ex,ey = list(map(int,input().split()))
init(n)
if dfs(x,y)==True:
print('YES')
else:
print('NO')
并查集
问题描述
w星球的一个种植园,被分成 m * n 个小格子(东西方向m行,南北方向n列)。每个格子里种了一株合根植物。
这种植物有个特点,它的根可能会沿着南北或东西方向伸展,从而与另一个格子的植物合成为一体。
如果我们告诉你哪些小格子间出现了连根现象,你能说出这个园中一共有多少株合根植物吗?
输入格式
第一行,两个整数m,n,用空格分开,表示格子的行数、列数(1<m,n<1000)。
接下来一行,一个整数k,表示下面还有k行数据(0<k<100000)
接下来k行,第2+k行两个整数a,b,表示编号为a的小格子和编号为b的小格子合根了。
格子的编号一行一行,从上到下,从左到右编号。
比如:5 * 4 的小格子,编号:
1234567891011121314151617181920
样例输入
54162315594878910101111121014121614181718151919209131317
样例输出
5definit(n):
for i inrange(1,n+1):
f[i]=i
deffind(x):
if f[x]==x:
return x
else:
f[x]=find(f[x])
return f[x]
defunion(x,y):
a = find(x)
b = find(y)
if a!=b:
f[a]=b
n,m = list(map(int,input().split()))
k = int(input())
f = [0for i inrange(m*n+1)]
l = [0for i inrange(m*n+1)]
init(n*m)
for i inrange(k):
x,y = list(map(int,input().split()))
union(x,y)
for i inrange(1,m*n+1):
l[find(i)]=1
ans = 0for i inrange(1,m*n+1):
if l[i]==1:
ans+=1print(ans)
哈夫曼树
n = int(input())
a = list(map(int,input().split()))
ans = 0whilelen(a)>1:
a.sort()
x = a[0]
a.pop(0)
y = a[0]
a.pop(0)
ans = ans+x+y
a.append(x+y)
print(ans)
# 学生按成绩排名由大到小,成绩相同按姓名字母序升序,之后按照id升序# aa 100 1# bb 100 2# c 100 3# d 90 4# aa 100 5
n = int(input())
a = []
for i inrange(n):
name,score,i = list(input().split())
x = [name,int(score),int(i)]
a.append(x)
a.sort(lambda a:(-a[1],a[0],a[2]))
for i inrange(n):
print('%s %d %d' %(a[i][0],a[i][1],a[i][2]))
最小生成树
import math
n,m = list(map(int,input().split()))
e = []
for i inrange(m):
x = list(map(int,input().split()))
e.append(x)
deffind(x):
if f[x]==x:
return x
else:
f[x]=find(f[x])
return f[x]
f = [0for i inrange(n+1)]
inf = 100000000000000defkruskal():
e.sort(lambda e:e[2])
for i inrange(n+1):
f[i]=i
res=0
cnt=0for i inrange(m):
a=e[i][0]
b=e[i][1]
w=e[i][2]
a=find(a)
b=find(b)
if a!=b:
f[a]=b
res+=w
cnt+=1if cnt<n-1:
return inf
return res
ans = kruskal()
if ans!=inf:
print(ans)
else:
print('impossible')
素数筛
import bisect
n = int(input())
prime = []
N = 1000000
st = [0for i inrange(N+1)]
for i inrange(2,N+1):
if st[i]==1:
continue
prime.append(i)
for j inrange(i,N+1,i):
st[j]=1
p = bisect.bisect_right(prime,n)
print(p)
最短路
Bell-man
n,m = list(map(int,input().split()))
e = []
for i inrange(m):
x = list(map(int,input().split()))
e.append(x)
e.sort(lambda e:e[2])
inf = 1000000000
dist = [inf for i inrange(1500)]
dist[1] = 0for i inrange(n):
for j inrange(m):
a = e[j][0]
b = e[j][1]
w = e[j][2]
if dist[b]>dist[a]+w:
dist[b]=dist[a]+w
if dist[n]==inf:
print(-1)
else:
print(dist[n])
dijkstra
n, m = map(int, input().split())
maxdist = float("inf")
g = [[maxdist] * (n+1) for _ inrange(n+1)] # 由于是密集图,m>>n,因此用邻接矩阵来存储,g[x][y]表示x指向y的距离
d = [maxdist] * (n+1) # 存储每个点距离起点的距离,初始化为距离最大,d[1]=0
st = [False] * (n+1) # 判断某一点的最短距离是否已经确定,False表示未确定,True表示确定defdijkstra():
d[1] = 0for i inrange(1, n+1): # 因为要确定n个点的最短路,因此要循环n次
t = -1for j inrange(1, n+1): # 每次找到还未确定最短路的点中距离起点最短的点tifnot st[j] and (t==-1or d[t]>d[j]):
t = j
st[t] = Truefor j inrange(1, n+1): # 用t来更新t所指向的点的距离
d[j] = min(d[j], d[t] + g[t][j])
if d[n] >= maxdist:
return -1else:
return d[n]
for _ inrange(m):
x, y, z = map(int, input().split())
g[x][y] = min(g[x][y], z) # 当出现重边时,只需取两个距离中的最小值print(dijkstra())
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(1)