python|闲谈2048小游戏和数组的旋转及翻转和转置

目录

2048

生成数组

n阶方阵

方阵旋转

顺时针旋转

逆时针旋转

mxn矩阵

矩阵旋转

测试代码

测试结果

翻转和转置


2048

《2048》是一款比较流行​的数字游戏​,最早于2014年3月20日发行。原版2048由Gabriele Cirulli首先在GitHub上发布,后被移植到各个平台,并且衍生出不计其数的版本。但在网上看到,居说它也不算是原创,是基于《1024》和《小3传奇》的玩法开发而成的;还有一说,它来源于另一款游戏《Threes!》,由Asher Vollmer和Greg Wohlwend合作开发,于2014年2月6日在App Store上架。

2048游戏规则很简单,游戏开始时在4x4的方格中随机出现数字2,每次可以选择上下左右其中一个方向去滑动,每滑动一次,所有的数字方块都会往滑动的方向靠拢外,相邻的相同数字在靠拢时会相加,系统也会在空白的格子里随机增加一个数字2或4。玩家要想办法在这16格范围中,不断上下左右滑动相加数字,从而凑出“2048”这个数字方块。

实际上,这个游戏就是在操作一个4x4的二维数组,数组的元素只要1-11就行了,因为2的11次方就是2048。同样,相邻相同数字的累加就变成了相邻相同指数的递增1。

在编写这个2048游戏前,先来谈谈4x4数组的操作,对python来说虽然也有数组,但通常会用列表来操作。以下就在IDLE shell上流水账操作:

生成数组

16个数字的列表推导式:

>>> [i for i in range(16)]
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15]

用*解包更pythonic:

>>> [*range(16)]
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15]

分割成4x4二维列表:

>>> [[*range(16)][i*4:i*4+4] for i in range(4)]
[[0, 1, 2, 3], [4, 5, 6, 7], [8, 9, 10, 11], [12, 13, 14, 15]]

只是数列如此写法可能更好:

>>> [[*range(i*4,i*4+4)] for i in range(4)]
[[0, 1, 2, 3], [4, 5, 6, 7], [8, 9, 10, 11], [12, 13, 14, 15]]

全0列表:

>>> [[0]*4 for _ in range(4)]
[[0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]]

n阶方阵

从4阶方阵扩展到n阶:

>>> matrix = lambda n:[[*range(i*n,i*n+n)] for i in range(n)]
>>> matrix(4)
[[0, 1, 2, 3], [4, 5, 6, 7], [8, 9, 10, 11], [12, 13, 14, 15]]
>>> matrix(5)
[[0, 1, 2, 3, 4], [5, 6, 7, 8, 9], [10, 11, 12, 13, 14], [15, 16, 17, 18, 19], [20, 21, 22, 23, 24]]
>>> matrix(6)
[[0, 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]]

随机生成数字1或2,比例为3:1:

>>> from random import sample as rnd
>>> rnd([1,1,1,2],1)
[1]
>>> rnd([1,1,1,2],1)
[2]
>>> rnd([1,1,1,2],1)
[2]
>>> rnd([1,1,1,2],1)

随机产生1或者2个“1”,比例为2:1:

>>> from random import sample as rnd
>>> x = 4
>>> rnd([0]*(x*x-2)+rnd([0,1,1],2),x*x)
[0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
>>> rnd([0]*(x*x-2)+rnd([0,1,1],2),x*x)
[0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0]
>>> rnd([0]*(x*x-2)+rnd([0,1,1],2),x*x)
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0]
x = 5
rnd([0]*(x*x-2)+rnd([0,1,1],2),x*x)
[0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
rnd([0]*(x*x-2)+rnd([0,1,1],2),x*x)
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0]
rnd([0]*(x*x-2)+rnd([0,1,1],2),x*x)
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1]
rnd([0]*(x*x-2)+rnd([0,1,1],2),x*x)
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]

方阵旋转

numpy有现成的函数rot90(),表示顺时针旋转数组90度。

>>> import numpy as np
>>> np.array(range(16))
array([ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15])
>>> np.array([[*range(i*4,i*4+4)] for i in range(4)])
array([[ 0,  1,  2,  3],
       [ 4,  5,  6,  7],
       [ 8,  9, 10, 11],
       [12, 13, 14, 15]])
>>> array = np.array([[*range(i*4,i*4+4)] for i in range(4)])

逆时针旋转,参数k为正数:

>>> np.rot90(array)
array([[ 3,  7, 11, 15],
       [ 2,  6, 10, 14],
       [ 1,  5,  9, 13],
       [ 0,  4,  8, 12]])
>>> np.rot90(array, k=2)
array([[15, 14, 13, 12],
       [11, 10,  9,  8],
       [ 7,  6,  5,  4],
       [ 3,  2,  1,  0]])
>>> np.rot90(array, k=3)
array([[12,  8,  4,  0],
       [13,  9,  5,  1],
       [14, 10,  6,  2],
       [15, 11,  7,  3]])

顺时针旋转,参数k为负数:

>>> np.rot90(array, k=-1)
array([[12,  8,  4,  0],
       [13,  9,  5,  1],
       [14, 10,  6,  2],
       [15, 11,  7,  3]])
>>> np.rot90(array, k=-2)
array([[15, 14, 13, 12],
       [11, 10,  9,  8],
       [ 7,  6,  5,  4],
       [ 3,  2,  1,  0]])
>>> np.rot90(array, k=-3)
array([[ 3,  7, 11, 15],
       [ 2,  6, 10, 14],
       [ 1,  5,  9, 13],
       [ 0,  4,  8, 12]])

不使用numpy,只用列表推导式也能实现旋转:

顺时针旋转

>>> matrix = lambda n:[[*range(i*n,i*n+n)] for i in range(n)]
>>> mat4 = matrix(4)
>>> mat4
[[0, 1, 2, 3], [4, 5, 6, 7], [8, 9, 10, 11], [12, 13, 14, 15]]
>>> [[mat[len(mat[0])-j-1][i] for j in range(len(mat[0]))] for i in range(len(mat))]
[[12, 8, 4, 0], [13, 9, 5, 1], [14, 10, 6, 2], [15, 11, 7, 3]]

写一个模拟np.array的__repr__方法来检测旋转效果:

class List():# 仅支持二维数组的展示def __init__(self, lst):self.x = lstdef __repr__(self):n = len(str(max(sum(self.x,[]))))res = []for mat in self.x:res.append(', '.join(f'{x:>{n}}' for x in mat))return '],\n\t['.join(res).join(['Array([ [','] ])'])

检测结果如下:

>>> matrix = lambda n:[[*range(i*n,i*n+n)] for i in range(n)]
>>> rotate = lambda m: [[m[len(m)-j-1][i] for j in range(len(m))] for i in range(len(m[0]))]
>>> mat4 =matrix(4)
>>> List(mat4)
Array([ [ 0,  1,  2,  3],
    [ 4,  5,  6,  7],
    [ 8,  9, 10, 11],
    [12, 13, 14, 15] ])
>>> List(rotate(mat4))
Array([ [12,  8,  4,  0],
    [13,  9,  5,  1],
    [14, 10,  6,  2],
    [15, 11,  7,  3] ])
>>> List(rotate(rotate(mat4)))
Array([ [15, 14, 13, 12],
    [11, 10,  9,  8],
    [ 7,  6,  5,  4],
    [ 3,  2,  1,  0] ])
>>> List(rotate(rotate(rotate(mat4))))
Array([ [ 3,  7, 11, 15],
    [ 2,  6, 10, 14],
    [ 1,  5,  9, 13],
    [ 0,  4,  8, 12] ])
>>> List(rotate(rotate(rotate(rotate(mat4)))))
Array([ [ 0,  1,  2,  3],
    [ 4,  5,  6,  7],
    [ 8,  9, 10, 11],
    [12, 13, 14, 15] ])

结果符合预期,旋转4次恢复原样;同样更高阶方阵也符合:

>>> List(matrix(5))
Array([ [ 0,  1,  2,  3,  4],
    [ 5,  6,  7,  8,  9],
    [10, 11, 12, 13, 14],
    [15, 16, 17, 18, 19],
    [20, 21, 22, 23, 24] ])
>>> List(rotate(matrix(5)))
Array([ [20, 15, 10,  5,  0],
    [21, 16, 11,  6,  1],
    [22, 17, 12,  7,  2],
    [23, 18, 13,  8,  3],
    [24, 19, 14,  9,  4] ])

逆时针旋转

>>> matrix = lambda n:[[*range(i*n,i*n+n)] for i in range(n)]
>>> rotate2 = lambda m:[[m[j][len(m[0])-i-1] for j in range(len(m))] for i in range(len(m[0]))]
>>> List(rotate2(matrix(4)))
Array([ [ 3,  7, 11, 15],
    [ 2,  6, 10, 14],
    [ 1,  5,  9, 13],
    [ 0,  4,  8, 12] ])
>>> List(rotate2(rotate2(matrix(4))))
Array([ [15, 14, 13, 12],
    [11, 10,  9,  8],
    [ 7,  6,  5,  4],
    [ 3,  2,  1,  0] ])
>>> List(rotate2(rotate2(rotate2(matrix(4)))))
Array([ [12,  8,  4,  0],
    [13,  9,  5,  1],
    [14, 10,  6,  2],
    [15, 11,  7,  3] ])
>>> List(rotate2(rotate2(rotate2(rotate2(matrix(4))))))
Array([ [ 0,  1,  2,  3],
    [ 4,  5,  6,  7],
    [ 8,  9, 10, 11],
    [12, 13, 14, 15] ])
>>> List(rotate2(matrix(5)))
Array([ [ 4,  9, 14, 19, 24],
    [ 3,  8, 13, 18, 23],
    [ 2,  7, 12, 17, 22],
    [ 1,  6, 11, 16, 21],
    [ 0,  5, 10, 15, 20] ])
>>> List(rotate2(rotate2(matrix(5))))
Array([ [24, 23, 22, 21, 20],
    [19, 18, 17, 16, 15],
    [14, 13, 12, 11, 10],
    [ 9,  8,  7,  6,  5],
    [ 4,  3,  2,  1,  0] ])

mxn矩阵

把方阵拓展到矩阵:

>>> matrix = lambda m, n: [[i * n + j for j in range(n)] for i in range(m)]
>>> List(matrix(3,4))
Array([ [ 0,  1,  2,  3],
    [ 4,  5,  6,  7],
    [ 8,  9, 10, 11] ])
>>> List(matrix(5,4))
Array([ [ 0,  1,  2,  3],
    [ 4,  5,  6,  7],
    [ 8,  9, 10, 11],
    [12, 13, 14, 15],
    [16, 17, 18, 19] ])
>>> List(matrix(5,5))
Array([ [ 0,  1,  2,  3,  4],
    [ 5,  6,  7,  8,  9],
    [10, 11, 12, 13, 14],
    [15, 16, 17, 18, 19],
    [20, 21, 22, 23, 24] ])

矩阵旋转

rotate顺时针旋转,rotate2逆时针旋转

>>> matrix = lambda m, n: [[i * n + j for j in range(n)] for i in range(m)]
>>> rotate = lambda m: [[m[len(m)-j-1][i] for j in range(len(m))] for i in range(len(m[0]))]
>>> rotate2 = lambda m:[[m[j][len(m[0])-i-1] for j in range(len(m))] for i in range(len(m[0]))]
>>> List(matrix(3,4))
Array([ [ 0,  1,  2,  3],
    [ 4,  5,  6,  7],
    [ 8,  9, 10, 11] ])
>>> List(rotate(matrix(3,4)))
Array([ [ 8,  4,  0],
    [ 9,  5,  1],
    [10,  6,  2],
    [11,  7,  3] ])
>>> List(rotate2(rotate2(rotate2(matrix(3,4)))))
Array([ [ 8,  4,  0],
    [ 9,  5,  1],
    [10,  6,  2],
    [11,  7,  3] ])
>>> List(rotate(rotate(matrix(3,4))))
Array([ [11, 10,  9,  8],
    [ 7,  6,  5,  4],
    [ 3,  2,  1,  0] ])
>>> List(rotate2(rotate2(matrix(3,4))))
Array([ [11, 10,  9,  8],
    [ 7,  6,  5,  4],
    [ 3,  2,  1,  0] ])
>>> List(rotate(rotate(rotate(matrix(3,4)))))
Array([ [ 3,  7, 11],
    [ 2,  6, 10],
    [ 1,  5,  9],
    [ 0,  4,  8] ])
>>> List(rotate2(matrix(3,4)))
Array([ [ 3,  7, 11],
    [ 2,  6, 10],
    [ 1,  5,  9],
    [ 0,  4,  8] ])
>>> List(rotate(rotate(rotate(rotate(matrix(3,4))))))
Array([ [ 0,  1,  2,  3],
    [ 4,  5,  6,  7],
    [ 8,  9, 10, 11] ])
List(rotate2(rotate2(rotate2(rotate2(matrix(3,4))))))
Array([ [ 0,  1,  2,  3],
    [ 4,  5,  6,  7],
    [ 8,  9, 10, 11] ])

旋转函数还能写成如下形式,只是坐标与range参数的互调形式:

>>> rotate = lambda m: [[m[j][i] for j in range(len(m)-1,-1,-1)] for i in range(len(m[0]))]
>>> rotate2 = lambda m: [[m[j][i] for j in range(len(m))] for i in range(len(m[0])-1,-1,-1)]

lambda匿名函数虽然很简洁,但没有普通函数易懂,我们把lambda函数改成模拟np.rot90()的普通函数rotate(matrix, k=1),其中参数k为90度的倍数,正数顺时针旋转,负数则逆时针旋转:

def rotate(matrix, k=1):rows = len(matrix)cols = len(matrix[0])res = [[0]*rows for _ in range(cols)]k %= 4if k==1:for i in range(rows):for j in range(cols):res[j][rows-i-1] = matrix[i][j]elif k==2:res = [[0]*cols for _ in range(rows)]for i in range(rows):for j in range(cols):res[rows-i-1][cols-j-1] = matrix[i][j]elif k==3:for i in range(rows):for j in range(cols):res[cols-j-1][i] = matrix[i][j]else:return matrixreturn res

测试代码

def rotate(matrix, k=1):rows = len(matrix)cols = len(matrix[0])res = [[0]*rows for _ in range(cols)]k %= 4if k==1:for i in range(rows):for j in range(cols):res[j][rows-i-1] = matrix[i][j]elif k==2:res = [[0]*cols for _ in range(rows)]for i in range(rows):for j in range(cols):res[rows-i-1][cols-j-1] = matrix[i][j]elif k==3:for i in range(rows):for j in range(cols):res[cols-j-1][i] = matrix[i][j]else:return matrixreturn resdef show(matrix):n = len(str(max(sum(matrix,[]))))res = []for mat in matrix:res.append(', '.join(f'{x:>{n}}' for x in mat))print('],\n\t['.join(res).join(['Array([ [','] ])']))matrix = lambda m, n: [[i * n + j for j in range(n)] for i in range(m)]for i in range(-4,5):show(rotate(matrix(4,4), i))for i in range(-4,5):show(rotate(matrix(5,3), i))

测试结果

Array([ [ 0,  1,  2,  3],
    [ 4,  5,  6,  7],
    [ 8,  9, 10, 11],
    [12, 13, 14, 15] ])
Array([ [12,  8,  4,  0],
    [13,  9,  5,  1],
    [14, 10,  6,  2],
    [15, 11,  7,  3] ])
Array([ [15, 14, 13, 12],
    [11, 10,  9,  8],
    [ 7,  6,  5,  4],
    [ 3,  2,  1,  0] ])
Array([ [ 3,  7, 11, 15],
    [ 2,  6, 10, 14],
    [ 1,  5,  9, 13],
    [ 0,  4,  8, 12] ])
Array([ [ 0,  1,  2,  3],
    [ 4,  5,  6,  7],
    [ 8,  9, 10, 11],
    [12, 13, 14, 15] ])
Array([ [12,  8,  4,  0],
    [13,  9,  5,  1],
    [14, 10,  6,  2],
    [15, 11,  7,  3] ])
Array([ [15, 14, 13, 12],
    [11, 10,  9,  8],
    [ 7,  6,  5,  4],
    [ 3,  2,  1,  0] ])
Array([ [ 3,  7, 11, 15],
    [ 2,  6, 10, 14],
    [ 1,  5,  9, 13],
    [ 0,  4,  8, 12] ])
Array([ [ 0,  1,  2,  3],
    [ 4,  5,  6,  7],
    [ 8,  9, 10, 11],
    [12, 13, 14, 15] ])
Array([ [ 0,  1,  2],
    [ 3,  4,  5],
    [ 6,  7,  8],
    [ 9, 10, 11],
    [12, 13, 14] ])
Array([ [12,  9,  6,  3,  0],
    [13, 10,  7,  4,  1],
    [14, 11,  8,  5,  2] ])
Array([ [14, 13, 12],
    [11, 10,  9],
    [ 8,  7,  6],
    [ 5,  4,  3],
    [ 2,  1,  0] ])
Array([ [ 2,  5,  8, 11, 14],
    [ 1,  4,  7, 10, 13],
    [ 0,  3,  6,  9, 12] ])
Array([ [ 0,  1,  2],
    [ 3,  4,  5],
    [ 6,  7,  8],
    [ 9, 10, 11],
    [12, 13, 14] ])
Array([ [12,  9,  6,  3,  0],
    [13, 10,  7,  4,  1],
    [14, 11,  8,  5,  2] ])
Array([ [14, 13, 12],
    [11, 10,  9],
    [ 8,  7,  6],
    [ 5,  4,  3],
    [ 2,  1,  0] ])
Array([ [ 2,  5,  8, 11, 14],
    [ 1,  4,  7, 10, 13],
    [ 0,  3,  6,  9, 12] ])
Array([ [ 0,  1,  2],
    [ 3,  4,  5],
    [ 6,  7,  8],
    [ 9, 10, 11],
    [12, 13, 14] ])

翻转和转置

翻转可以是水平方向和重置方向的:

>>> matrix = lambda m, n: [[i * n + j for j in range(n)] for i in range(m)]
>>> flipH = lambda m: [[m[i][len(m[0])-j-1] for j in range(len(m[0]))] for i in range(len(m))]
>>> flipV = lambda m: [[m[len(m)-j-1][i] for i in range(len(m[0]))] for j in range(len(m))]
>>> List(flipH(matrix(4,4)))
Array([ [ 3,  2,  1,  0],
    [ 7,  6,  5,  4],
    [11, 10,  9,  8],
    [15, 14, 13, 12] ])
>>> List(flipV(matrix(4,4)))
Array([ [12, 13, 14, 15],
    [ 8,  9, 10, 11],
    [ 4,  5,  6,  7],
    [ 0,  1,  2,  3] ])
>>> List(flipH(matrix(3,5)))
Array([ [ 4,  3,  2,  1,  0],
    [ 9,  8,  7,  6,  5],
    [14, 13, 12, 11, 10] ])
>>> List(flipV(matrix(3,5)))
Array([ [10, 11, 12, 13, 14],
    [ 5,  6,  7,  8,  9],
    [ 0,  1,  2,  3,  4] ])
>>> List(flipH(matrix(5,4)))
Array([ [ 3,  2,  1,  0],
    [ 7,  6,  5,  4],
    [11, 10,  9,  8],
    [15, 14, 13, 12],
    [19, 18, 17, 16] ])
>>> List(flipV(matrix(5,4)))
Array([ [16, 17, 18, 19],
    [12, 13, 14, 15],
    [ 8,  9, 10, 11],
    [ 4,  5,  6,  7],
    [ 0,  1,  2,  3] ])

转置可以看作是翻转和旋转的组合,对方阵来说就是以对角线为轴的翻转:

>>> transpose = lambda m: [[m[j][i] for j in range(len(m))] for i in range(len(m[0]))]
>>> List(transpose(matrix(4,4)))
Array([ [ 0,  4,  8, 12],
    [ 1,  5,  9, 13],
    [ 2,  6, 10, 14],
    [ 3,  7, 11, 15] ])
>>> List(transpose(transpose(matrix(4,4))))
Array([ [ 0,  1,  2,  3],
    [ 4,  5,  6,  7],
    [ 8,  9, 10, 11],
    [12, 13, 14, 15] ])
>>> List(rotate(matrix(4,4)))
Array([ [12,  8,  4,  0],
    [13,  9,  5,  1],
    [14, 10,  6,  2],
    [15, 11,  7,  3] ])
>>> List(flipH(rotate(matrix(4,4))))
Array([ [ 0,  4,  8, 12],
    [ 1,  5,  9, 13],
    [ 2,  6, 10, 14],
    [ 3,  7, 11, 15] ])
>>> List(rotate2(matrix(4,4)))
Array([ [ 3,  7, 11, 15],
    [ 2,  6, 10, 14],
    [ 1,  5,  9, 13],
    [ 0,  4,  8, 12] ])
>>> List(flipV(rotate2(matrix(4,4))))
Array([ [ 0,  4,  8, 12],
    [ 1,  5,  9, 13],
    [ 2,  6, 10, 14],
    [ 3,  7, 11, 15] ])

在numpy中,转置由.T属性完成

>>> import numpy as np
>>> arr = np.array(matrix(3,4))
>>> arr
array([[ 0,  1,  2,  3],
       [ 4,  5,  6,  7],
       [ 8,  9, 10, 11]])
>>> arr.T
array([[ 0,  4,  8],
       [ 1,  5,  9],
       [ 2,  6, 10],
       [ 3,  7, 11]])
>>> arr = np.array(matrix(4,4))
>>> arr.T
array([[ 0,  4,  8, 12],
       [ 1,  5,  9, 13],
       [ 2,  6, 10, 14],
       [ 3,  7, 11, 15]])
>>> arr.T.T
array([[ 0,  1,  2,  3],
       [ 4,  5,  6,  7],
       [ 8,  9, 10, 11],
       [12, 13, 14, 15]])
>>> arr = np.array(matrix(5,4))
>>> arr.T
array([[ 0,  4,  8, 12, 16],
       [ 1,  5,  9, 13, 17],
       [ 2,  6, 10, 14, 18],
       [ 3,  7, 11, 15, 19]])


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/707245.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Day59】代码随想录之动态规划_583两个字符串的删除操作_72编辑距离

文章目录 动态规划理论基础动规五部曲:出现结果不正确: 1. 583两个字符串的删除操作2. 72编辑距离 动态规划理论基础 动规五部曲: 确定dp数组 下标及dp[i] 的含义。递推公式:比如斐波那契数列 dp[i] dp[i-1] dp[i-2]。初始化d…

选择排序的简单介绍

选择排序是一种简单直观的排序算法,其原理如下: 1. 遍历数组,找到最小(或最大)的元素,并将其与数组的第一个元素交换位置。 2. 接着在剩下的元素中找到最小(或最大)的元素&#xff…

园区水费收费管理系统

园区水费收费管理系统是专为园区或小区的水费管理而设计的系统,旨在提高水费收费效率、精准监测水费使用情况,简化管理流程,为园区管理方和居民提供便捷、高效的水费管理解决方案。该系统结合了数字化技术和智能化管理手段,通过线…

动态规划-状态转移(O(n))

获取生成数组中的最大值 1.题目 2.思路 其实只要看透该题的本质 并不难,应用动态规划,题目就已经给出了状态方程的式子。 首先规定好maxn的大小,防止溢出。定义nums数组。定义一个函数,写入状态方程式子。最后定义一个变量与数…

【数据结构】数组

第一章、为什么数组的下标一般从0开始编号 提到数组,读者肯定不陌生,甚至还会很自信地说,数组很简单。编程语言中一般会有数组这种数据类型。不过,它不仅是编程语言中的一种数据类型,还是基础的数据结构。尽管数组看起…

Openstack云计算架构及前期服务搭建

openstack介绍 Openstack是一个开源的云计算管理平台项目,由几个主要的组件组合起来完成具体工作,支持几乎所有的云环境,项目目标是提供实施简单、可大规模扩展、丰富、标准统一的云计算管理平台 ----百度百科 Openstack是一个云操作系统&a…

css常用的选择器介绍

CSS(层叠样式表)选择器是CSS规则的一部分,它用于选择和定位网页上的元素,以便将样式应用到这些元素上。CSS选择器的种类繁多,每种选择器都有其特定的用途、特点和效率。在这篇文章中,我们将讨论一些常用的C…

环境分析检测小剂量移液用耐受硝酸盐酸PFA材质吸管特氟龙移液枪枪头

PFA枪头,为移液枪专业定制,广泛用于ICP-MS、ICP-OES等痕量分析以及同位素分析等实验室。地质、电子化学品、半导体分析测试、疾控中心、制药厂、环境检测中心等一些机构少量移液用。 规格参考:0.1-0.2ml、1ml、2ml、5ml、10ml等。 目前部分规格可适配普…

什么是智能运维产品线和服务线

智能运维产品线和服务线涵盖了一系列自动化和智能化的技术和服务,旨在提升IT运维的效率和有效性。智能运维(AIOps)利用大数据、分析技术和机器学习能力来自动执行和简化运营工作流程,包括收集和汇总多源IT基础架构组件的数据、应用…

el-checkbox实现全选,反选,单选

<template><div class"box"><el-checkbox v-model"checkAll" :indeterminate"isIndeterminate" change"onAllSelectChange"> 全选</el-checkbox><div class"item" v-for"(item,index) in l…

R语言——条形图数据可视化的多种方式

本文章将会介绍如何使用R语言中的ggplot2包使用条形图进行数据可视化。将会使用一个“生产企业原材料的订购与运输”的订单数据&#xff0c;该数据来自2021数学建模国赛C题。 某建筑和装饰板材的生产企业所用原材料主要是木质纤维和其他植物素纤维材料总体可分为 A B C 三种类…

【C++那些事儿】深入理解C++类与对象:从概念到实践(上)| 揭开this指针的神秘面纱

&#x1f4f7; 江池俊&#xff1a; 个人主页 &#x1f525;个人专栏&#xff1a; ✅数据结构冒险记 ✅C那些事儿 &#x1f305; 有航道的人&#xff0c;再渺小也不会迷途。 文章目录 1. 面向过程和面向对象初步认识2.类的引入3.类的定义4.类的访问限定符及封装4.1 访问限定符…

【蓝桥杯】快读|min和max值的设置|小明和完美序列|​顺子日期​|星期计算|山

目录 一、输入的三种方式 1.最常见的Scanner的输入方法 2.数据多的时候常用BufferedReader快读 3.较麻烦的StreamTokenizer快读&#xff08;用的不多&#xff09; StreamTokenizer常见错误&#xff1a; 二、min和max值的设置 三、妮妮的翻转游戏 四、小明和完美序列 五…

AI引擎助力,CamScanner智能高清滤镜开启扫描新纪元!

文章目录 ⭐ 写在前面⭐ 突破图像处理难点&#xff1a;扫描全能王的独特优势⭐ 耳听为虚&#xff0c;眼见为实⭐ 产品背后的主要核心&#xff1a;AI-Scan助力⭐ 深度学习助力智能文档处理的国际化进程⭐ 品味智能文档处理的轻松与精准 ⭐ 写在前面 在数字化快速发展的今天&…

MySQL 篇-深入了解 DML、DQL 语言(二)

&#x1f525;博客主页&#xff1a; 【小扳_-CSDN博客】 ❤感谢大家点赞&#x1f44d;收藏⭐评论✍ 文章目录 1.0 DML、DQL 语言说明 2.0 使用 DML 实现对数据管理和操作 2.1 DML - 增添数据 insert 2.2 DML - 修改数据 update 2.3 DML - 删除数据 delete 3.0 使用 DQL 实现对…

数据界的达克摩斯之剑----深入浅出带你理解网络爬虫(Forth)

目录 3.爬虫身份识别 4.用户爬虫的例子 4.1 开源爬虫 网络爬虫的组成 控制器 解析器 资源库 3.爬虫身份识别 网络爬虫通过使用http请求的用户代理&#xff08;User Agent&#xff09;字段来向网络服务器表明他们的身份。网络管理员则通过检查网络服务器的日志&#xff0…

77. 组合(力扣LeetCode)

文章目录 77. 组合题目描述回溯算法组合问题的剪枝操作 77. 组合 题目描述 给定两个整数 n 和 k&#xff0c;返回范围 [1, n] 中所有可能的 k 个数的组合。 你可以按 任何顺序 返回答案。 示例 1&#xff1a; 输入&#xff1a;n 4, k 2 输出&#xff1a; [ [2,4], [3,4],…

ArcgisForJS如何将ArcGIS Server发布的点要素渲染为热力图?

文章目录 0.引言1.ArcGIS创建点要素2.ArcGIS Server发布点要素3.ArcgisForJS将ArcGIS创建的点要素渲染为热力图 0.引言 ArcGIS For JS 是一个强大的地理信息系统&#xff08;GIS&#xff09;工具&#xff0c;它允许开发者使用 JavaScript 语言来创建各种 GIS 应用。ArcGIS Ser…

DolphinScheduler——介绍及架构设计

目录 一、DolphinScheduler介绍 1.1 概述 1.2 特性 1.2.1 简单易用 1.2.2 丰富的使用场景 1.2.3 High Reliability 1.2.4 High Scalability 1.3 名词解释 1.3.1 名词解释 1.3.2 模块介绍 二、DolphinScheduler架构原理 2.1 系统架构图 2.2 架构说明 2.2.1 Maste…

音频混音算法的实现

最近项目有用到混音算法&#xff0c;这里用比较常见的一种&#xff0c;就是简单的加和之后做一下归一化。 是参考这个博主实现的&#xff1a; 音频混音的算法实现 下面直接贴代码&#xff1a; #include <stdio.h> #include <stdlib.h> #include <math.h&…