今天的题目也是采用python进行实现,需要两个包 ctype 和 random
1.自建一个列表
创建一个空列表 – 判断列表是否为空 – 列表的长度和容量 – append,insert,remove功能实现
import ctypes
class MyArray:
def __init__(self):
"空列表"
self._n = 0
self._capacity = 15
self.A = self._make_array(self._capacity)
def _make_array(self, k):
return (k*ctypes.py_object)()
def __len__(self):
return self._n
def is_empty(self):
return self._n == 0
def __getitem__(self, k):
if not 0 <= k < self._n:
raise ValueError
return self.A[k]
def resize(self, c):
B = self._make_array(c)
for i in range(self._n):
B[i] = A[i]
self._capacity = c
self.A = B
def insert(self, k, value):
if self._n == self._capacity:
self.resize(2*self._capacity)
for i in range(self._n, k, -1):
self.A[i] = self.A[i-1]
self.A[k] = value
self._n += 1
def append(self, value):
if self._n == self._capacity:
self.resize(2*self._capacity)
self.A[self._n] = value
self._n += 1
def remove(self, k):
if not 0 <= k < self._n:
raise ValueError
for i in range(k, self._n-1):
self.A[k] = self.A[k+1]
self.A[self._n-1] = None
self._n -= 1
def _print(self):
for i in range(self._n):
print(self.A[i], end = ' ')
print()
mylist = MyArray()
print ('size was: ', str(len(mylist)))
mylist.append(10)
mylist.append(20)
mylist.insert(2, 30)
mylist.remove(2)
mylist._print()
首先对于append/insert来说,需要注意几个点:
插入位置是否超过列表的长度,若已经超过的话,需要重新建立一个更大的列表,再append。
insert需要倒着写,才会保证数不会被覆盖。 (可以画图理解)
remove需要正着写,同样保证数不会被覆盖。
为了验证函数功能,可以在类定义一个print函数进行验证。
2.简单扫雷
编写一个三参数的程序(M,N,p),其中M和N分别代表行和列,p代表为地雷的可能性,用“*”表示地雷,“-”表示安全,打印此表格,并统计每个小格子的地雷数,打印结果。
对于边界来说,就不一定是8个临接点,所以为了使程序更加简单,我们可以扩大边界,只在需要计算的边界进行赋值计算
import random
def minesweep(m,n,p):
# 创建棋盘和地雷
board = [[None] * (n+2) for i in range(m+2)]
for i in range(1, m+1):
for j in range(1, n+1):
r = random.random()
if r < p:
board[i][j] = -1
else:
board[i][j] = 0
# 打印雷盘
for i in range(1, m+1):
for j in range(1, n+1):
print('*', end=' ') if board[i][j] == -1 else print('-', end=' ')
print()
print()
# 开始计数
for i in range(1, m+1):
for j in range(1, n+1):
if board[i][j] != 1:
for ii in range(i-1, i+2):
for jj in range(j-1, j+2):
if board[ii][jj] == -1:
board[i][j] += 1
# 打印个数矩阵
for i in range(1, m+1):
for j in range(1, n+1):
print(board[i][j], end= ' ')
print()
# 调用扫雷函数
minesweep(5, 10, 0.2)
打卡第二天 gogogogo