校招算法笔面试 | 华为机试-Sudoku

题目

题目链接

解题思路

数独问题是一个典型的回溯算法题目。解题思路如下:

  1. 遍历整个9x9的数独板
  2. 当遇到空格(值为0)时,尝试填入1-9的数字
  3. 对每个尝试的数字,检查是否满足数独规则:
    • 同行不重复
    • 同列不重复
    • 同一个3x3方格内不重复
  4. 如果当前数字有效,递归解决剩余的空格
  5. 如果递归失败,回溯并尝试下一个数字

代码

#include <iostream>
#include <vector>
using namespace std;

class Solution {
public:
    bool isValid(vector<vector<int>>& board, int row, int col, int num) {
        for(int x = 0; x < 9; x++) {
            if(board[row][x] == num) return false;
        }
        
        for(int x = 0; x < 9; x++) {
            if(board[x][col] == num) return false;
        }
        
        int startRow = row - row % 3, startCol = col - col % 3;
        for(int i = 0; i < 3; i++) {
            for(int j = 0; j < 3; j++) {
                if(board[i + startRow][j + startCol] == num) return false;
            }
        }
        return true;
    }
    
    bool solveSudoku(vector<vector<int>>& board) {
        int row = -1, col = -1;
        bool isEmpty = false;
        
        for(int i = 0; i < 9; i++) {
            for(int j = 0; j < 9; j++) {
                if(board[i][j] == 0) {
                    row = i;
                    col = j;
                    isEmpty = true;
                    break;
                }
            }
            if(isEmpty) break;
        }
        
        if(!isEmpty) return true;
        
        for(int num = 1; num <= 9; num++) {
            if(isValid(board, row, col, num)) {
                board[row][col] = num;
                if(solveSudoku(board)) return true;
                board[row][col] = 0;
            }
        }
        return false;
    }
};

int main() {
    vector<vector<int>> board(9, vector<int>(9));
    
    // 读入数独
    for(int i = 0; i < 9; i++) {
        for(int j = 0; j < 9; j++) {
            cin >> board[i][j];
        }
    }
    
    Solution solution;
    solution.solveSudoku(board);
    
    // 输出结果
    for(int i = 0; i < 9; i++) {
        for(int j = 0; j < 9; j++) {
            cout << board[i][j];
            if(j < 8) cout << " ";
        }
        cout << endl;
    }
    
    return 0;
}
def isValid(board, row, col, num):
    for x in range(9):
        if board[row][x] == num:
            return False
            
    for x in range(9):
        if board[x][col] == num:
            return False
            
    startRow, startCol = row - row % 3, col - col % 3
    for i in range(3):
        for j in range(3):
            if board[i + startRow][j + startCol] == num:
                return False
    return True

def solveSudoku(board):
    row = col = -1
    isEmpty = False
    
    for i in range(9):
        for j in range(9):
            if board[i][j] == 0:
                row, col = i, j
                isEmpty = True
                break
        if isEmpty:
            break
            
    if not isEmpty:
        return True
        
    for num in range(1, 10):
        if isValid(board, row, col, num):
            board[row][col] = num
            if solveSudoku(board):
                return True
            board[row][col] = 0
    return False

# 读入数独
board = []
for _ in range(9):
    row = list(map(int, input().split()))
    board.append(row)

solveSudoku(board)

# 输出结果
for i in range(9):
    print(" ".join(map(str, board[i])))
import java.util.Scanner;

public class Main {
    public static boolean isValid(int[][] board, int row, int col, int num) {
        for(int x = 0; x < 9; x++) {
            if(board[row][x] == num) return false;
        }
        
        for(int x = 0; x < 9; x++) {
            if(board[x][col] == num) return false;
        }
        
        int startRow = row - row % 3, startCol = col - col % 3;
        for(int i = 0; i < 3; i++) {
            for(int j = 0; j < 3; j++) {
                if(board[i + startRow][j + startCol] == num) return false;
            }
        }
        return true;
    }
    
    public static boolean solveSudoku(int[][] board) {
        int row = -1, col = -1;
        boolean isEmpty = false;
        
        for(int i = 0; i < 9; i++) {
            for(int j = 0; j < 9; j++) {
                if(board[i][j] == 0) {
                    row = i;
                    col = j;
                    isEmpty = true;
                    break;
                }
            }
            if(isEmpty) break;
        }
        
        if(!isEmpty) return true;
        
        for(int num = 1; num <= 9; num++) {
            if(isValid(board, row, col, num)) {
                board[row][col] = num;
                if(solveSudoku(board)) return true;
                board[row][col] = 0;
            }
        }
        return false;
    }
    
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int[][] board = new int[9][9];
        
        // 读入数独
        for(int i = 0; i < 9; i++) {
            for(int j = 0; j < 9; j++) {
                board[i][j] = scanner.nextInt();
            }
        }
        
        solveSudoku(board);
        
        // 输出结果
        for(int i = 0; i < 9; i++) {
            for(int j = 0; j < 9; j++) {
                System.out.print(board[i][j]);
                if(j < 8) System.out.print(" ");
            }
            System.out.println();
        }
        
        scanner.close();
    }
}

算法及复杂度

  • 算法:回溯算法(深度优先搜索)
  • 时间复杂度: O ( 9 m ) \mathcal{O}(9^m) O(9m),其中 m m m 是空格的数量。对于每个空格都需要尝试9个数字。
  • 空间复杂度: O ( m ) \mathcal{O}(m) O(m),其中 m m m 是空格的数量,主要是递归调用栈的开销。
内容概要:本文围绕碳排放流理论混合整数线性规划(MILP)方法,开展源荷协同优化研究,旨在通过Matlab代码实现低碳、高效的能源系统调度。研究综合考虑电源侧、负荷侧及电网传输环节,构建了能够精确追踪碳排放流动路径的优化模型,并采用MILP方法进行多时段协同决策求解,实现了对系统运行的全局优化。文中系统阐述了碳排放流的建模机制、源荷两侧的协同约束条件以及以碳排放最小化为核心的多目标函数设计方法,通过Matlab编程完成模型求解仿真验证,结果表明该方法能有效降低系统整体碳排放水平,提升清洁能源消纳能力,并优化能源资源配置效率。; 适合人群:具备一定电力系统、运筹学及低碳能源系统相关基础知识,熟悉Matlab编程环境,从事能源系统优化、综合能源管理、碳排放核算调度、虚拟电厂等领域研究的科研人员、工程技术人员及研究生。; 使用场景及目标:①应用于虚拟电厂、区域综合能源系统、微电网等场景下的多时间尺度低碳优化调度;②实现电网中碳排放责任的精细化溯源分摊,为碳交易机制下的经济激励成本分摊提供量化依据;③为新型电力系统低碳化、清洁化型提供科学的分析工具决策支持手段。; 阅读建议:读者应结合文中提供的Matlab代码,深入理解碳排放流建模的数学逻辑MILP优化问题的构建过程,重点关注目标函数约束条件的数学表达形式及其物理意义,建议动手复现算例,通过调整参数和场景设置,探究不同因素对优化结果的影响,从而深化对源荷协同机制碳流分配原理的认知。
内容概要:本文针对传统三电平并网逆变器在谐波抑制、电网不平衡工况适应性及动态响应方面的不足,以有源中点箝位(ANPC)三电平逆变器为研究对象,提出一种融合双极性倍频脉宽调制(DPWMA)、正负序分离锁相电网电压前馈控制的复合控制策略。通过深入分析ANPC拓扑的结构特征,充分发挥其在开关损耗均衡、输出波形质量及中点电位可控性方面的固有优势。在此基础上,采用DPWMA调制提升等效开关频率,显著降低输出电流谐波含量;引入正负序分离锁相技术,实现电网电压正负序分量的精准解耦,确保在电网不平衡条件下仍能维持精确的相位同步;结合电网电压前馈控制,构建前馈-反馈复合控制体系,有效抑制电网电压扰动对并网电流的影响,大幅缩短系统动态响应时间,提升抗扰能力。最终通过Simulink平台搭建完整的仿真模型,对系统在稳态运行、电网电压不平衡及动态工况切换等多种场景下进行了全面验证,结果表明该复合控制策略能显著提升并网电能质量系统整体稳定性。; 适合人群:电力电子、新能源并网、自动化及相关专业的研究生、科研人员及从事逆变器控制算法开发的工程技术人员。; 使用场景及目标:① 提升大功率并网逆变器在复杂电网环境下的运行性能;② 解决电网电压不平衡导致的锁相偏差功率波动问题;③ 优化并网电流波形质量,满足高电能质量标准;④ 为ANPC等多电平逆变器的高性能控制提供仿真设计参考。; 阅读建议:建议结合Simulink仿真模型同步学习,重点关注DPWMA调制实现逻辑、正负序分离锁相环设计及前馈-反馈复合控制结构的搭建,可通过对比实验深入理解各项技术对系统性能的提升效果。
内容概要:本文系统研究了构网型GFM-VSG跟网型GFL-PQ逆变器在混合并联并网系统中的协同运行机制动态响应特性。通过Simulink平台构建仿真模型,深入分析了GFM(构网型)逆变器基于虚拟同步发电机(VSG)控制所具备的自主调频调压能力和惯量支撑特性,以及GFL(跟网型)逆变器基于PQ控制实现的恒功率输出特性。研究涵盖了混合系统在并网过程中的功率分配策略、频率扰动下的动态响应、电压稳定性及暂态行为,重点揭示了两类逆变器在强/弱电网条件下的相互作用规律潜在控制冲突,并提出了相应的协调控制策略以提升系统整体稳定性、电能质量及并网友好性。; 适合人群:具备电力电子、新能源并网或微电网系统基础知识,从事相关领域研究的研究生、高校科研人员及电力系统工程技术人员。; 使用场景及目标:①深入理解构网型跟网型逆变器的核心工作原理、控制差异及其在现代电网中的角色定位;②掌握混合并网系统的建模、仿真动态性能分析方法;③研究多类型逆变器并联运行时的稳定性挑战协调控制解决方案,为新型电力系统的设计优化提供理论依据和技术参考; 阅读建议:此资源以Simulink仿真实现为核心,建议读者结合文中详细的控制策略描述,动手搭建或复现仿真模型,通过设置不同工况(如负载突变、电网强度变化、频率扰动等)来观察系统的动态响应过程,从而深化对理论知识的理解并提升工程实践认知能力。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值