每日编程题 02

今天的题目也是采用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

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值