牛客刷题 | HJ42 学英语 ,HJ44 Sudoku

本文介绍了如何使用Python解决牛客网上的编程问题,包括将数字按照特定格式读出(如1234567转换为1,234,567)以及运用回溯法求解数独问题,展示了编程中的逻辑和算法应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

HJ42 学英语

题目链接:学英语_牛客题霸_牛客网 (nowcoder.com)

思路:学习了牛客的题解。由于每三个数字时一组,可以先设置三位数字(即小于1000)的读法,然后分成百万组,千组,个组,根据数字的长度来分配每一组前面的数字。

如:num = 1234567-->1,234,567  

百万组:1,234,567 mod 1,000,000 = 1 --> 1百万

千组:(1,234,567 // 1,000)mod 1000 = 234 --> 234千

个组:1234567 mod 1000  --> 567

代码

import sys

num = int(sys.stdin.readline().strip())
num1 = ['zero','one','two','three','four','five','six',
       'seven','eight','nine','ten','eleven','twelve',
       'thirteen','fourteen','fifteen','sixteen',
       'seventeen','eighteen','nineteen']
num2 = [0,0,'twenty','thirty','forty','fifty','sixty',
       'seventy','eighty','ninety']

def n2w(n):
    if n > 0:
        if n < 20:
            word.append(num1[n])
        else:
            word.append(num2[n//10])
            if n%10 != 0:
                word.append(num1[n%10])

def hun(n):
    if n >= 100:
        word.append(num1[n//100])
        word.append('hundred')
        if n % 100 != 0:
            word.append('and')
    n2w(n%100)

word = []
a = num % 1000  # 百十个位
b = (num//1000) % 1000   # 万千位
c = num//1000000   # 百万位

if c > 0 :
    hun(c)
    word.append('million')
if b > 0:
    hun(b)
    word.append('thousand')
if a > 0 :
    hun(a)
print(' '.join(word))

HJ 44 Sudoku

题目链接:Sudoku_牛客题霸_牛客网 (nowcoder.com)

思路:巩固了之前学过的回溯的知识。

通过两个嵌套的循环,遍历数独矩阵的 每个位置。当遇到一个空格('0')时,它尝试填入1到9的数字,检查是否满足数独规则(在行、列、和小九宫格中没有重复的数字)。如果满足规则,它就递归调用自身,尝试填充下一个空格。如果成功找到一个合法的填充,整个递归栈会一直返回True,直到填满整个数独。

如果在某个位置尝试了1到9的所有数字都不能找到合法的解,就会触发回溯。这时会将当前位置的数字重新设为'0',然后返回上一层递归,继续尝试其他数字。这保证了算法能够尝试所有可能的组合,直到找到解或者确定无解。

代码

import sys

matrix = [[0]*9 for _ in range(9)]
for i in range(9):
    matrix[i] = sys.stdin.readline().strip().split()

def backtracking(matrix):
    for i in range(9):
        for j in range(9):
            if matrix[i][j] == '0':
                for value in range(1,10):
                    if isValid(matrix, i, j, str(value)):
                        matrix[i][j] = str(value)
                        if backtracking(matrix): 
                            return True
                    matrix[i][j] = '0'
                return False   
           # return False 的作用是通知上层递归栈,当前的尝试并不成功,需要进行回溯。
    return True


def isValid(m, x, y, value):
    for j in range(9):
        if m[x][j] == value:
            return False
    for i in range(9):
        if m[i][y] == value:
            return False
    xboard = x//3
    yboard = y//3

    for i in range(xboard*3, (xboard+1)*3):
        for j in range(yboard*3, (yboard+1)*3):
            if m[i][j] == value:
                return False
    return True


backtracking(matrix)
for i in range(9):
    matrix[i] = list(map(str, matrix[i]))
    print(' '.join(matrix[i]))


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值