数组输入:
可以提前定义
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)
二分
# 二分查询import bisect
a =[0,1,2,4,6,7,9,10]# bisect_left查找a数组中第一个大于等于5的数的下标# bisect_right找a数组中第一个大于4的数的下标print(bisect.bisect_left(a,5))print(bisect.bisect_left(a,4))print(bisect.bisect_right(a,4))# insort_left# insort_right
# 学生按成绩排名由大到小,成绩相同按姓名字母序升序,之后按照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 _ in range(n+1)] # 由于是密集图,m>>n,因此用邻接矩阵来存储,g[x][y]表示x指向y的距离
d = [maxdist] * (n+1) # 存储每个点距离起点的距离,初始化为距离最大,d[1]=0
st = [False] * (n+1) # 判断某一点的最短距离是否已经确定,False表示未确定,True表示确定
def dijkstra():
d[1] = 0
for i in range(1, n+1): # 因为要确定n个点的最短路,因此要循环n次
t = -1
for j in range(1, n+1): # 每次找到还未确定最短路的点中距离起点最短的点t
if not st[j] and (t==-1 or d[t]>d[j]):
t = j
st[t] = True
for j in range(1, n+1): # 用t来更新t所指向的点的距离
d[j] = min(d[j], d[t] + g[t][j])
if d[n] >= maxdist:
return -1
else:
return d[n]
for _ in range(m):
x, y, z = map(int, input().split())
g[x][y] = min(g[x][y], z) # 当出现重边时,只需取两个距离中的最小值
print(dijkstra())