当前位置: 首页 > news >正文

算法分析与设计编程题 递归与分治策略

棋盘覆盖

题目描述

请添加图片描述

请添加图片描述

解题代码

// para: 棋盘,行偏移,列偏移,特殊行,特殊列
void dividedCovering(vector<vector<int>>& chessBoard, int dr, int dc, int sr, int sc, int size) {if (size == 1) return;size /= 2; // 划分为四部分if (sr < dr + size && sc < dc + size) { // 特殊点位于左上部分divideCovering(chessBoard, dr, dc, sr, sc, size);}else {int nr = dr + size - 1, nc = dc + size - 1; // 新覆盖点chessBoard[nr][nc] = 1;divideCovering(chessBoard, dr, dc, nr, nc, size);}if (sr < dr + size && sc >= dc + size) { // 特殊点位于右上部分divideCovering(chessBoard, dr, dc + size, sr, sc, size);}else {int nr = dr + size - 1, nc = dc + size;chessBoard[nr][nc] = 1;divideCovering(chessBoard, dr, dc + size, nr, nc, size);}if (sr >= dr + size && sc < dc + size) { // 特殊点位于左下部分divideCovering(chessBoard, dr + size, dc, sr, sc, size);}else {int nr = dr + size, nc = dc + size - 1;chessBoard[nr][nc] = 1;divideCovering(chessBoard, dr + size, dc, nr, nc, size);}if (sr >= dr + size && sc >= dc + size) { // 特殊点位于右下部分divideCovering(chessBoard, dr + size, dc + size, sr, sc, size);}else {int nr = dr + size, nc = dc + size;chessBoard[nr][nc] = 1;divideCovering(chessBoard, dr + size, dc + size, nr, nc, size);}
}void chessBoardCovering(vector<vector<int>>& chessBoard, int sr, int sc) {int n = chessBoard.size();divideCovering(chessBoard, 0, 0, sr, sc, n);
}

线性时间选择

题目描述

请添加图片描述

解题代码

int partition(vector<int>& nums, int left, int right) {int randIdx = rand() % (right - left + 1) + left; // 选取随机pivotswap(randIdx, nums[left]);int pivot = nums[left];while (left < right) {while (left < right && nums[right] >= pivot) --right;nums[left] = nums[right];while (left < right && nums[left] <= pivot) ++left;nums[right] = nums[left];}nums[left] = pivot;return left;
}int dividedQuickSelect(vector<int>& nums, int left, int right, int k) {if (left >= right) return nums[left];int p = partition(nums, left, right); // 根据基准进行划分if (p == k) return nums[p]; // 划分基准正好为第k小的数else if (p > k) return divideQuickSelect(nums, left, p - 1, k); // 基准大于第k小else return divideQuickSelect(nums, p + 1, right, k); // 基准小于第k小
}int quickSelect(vector<int>& nums, int k) {srand((unsigned)time(nullptr)); // 设定随机种子return divideQuickSelect(nums, 0, nums.size() - 1, k - 1);
}
http://www.lryc.cn/news/166413.html

相关文章:

  • Java的XWPFTemplate工具类导出word.docx的使用
  • Science adv | 转录因子SPIC连接胚胎干细胞中的细胞代谢与表观调控
  • 机器学习实战-系列教程7:SVM分类实战2线性SVM(鸢尾花数据集/软间隔/线性SVM/非线性SVM/scikit-learn框架)项目实战、代码解读
  • DOM渲染与优化 - CSS、JS、DOM解析和渲染阻塞问题
  • 基于小程序的理发店预约系统
  • MD5 算法流程
  • TCP/IP协议详解
  • SSM SpringBoot vue快递柜管理系统
  • 期权交易保证金比例一般是多少?
  • 029:vue项目,勾选后今天不再弹窗提示
  • Unet语义分割-语义分割与实例分割概述-001
  • Linux常用命令字典篇
  • __declspec(novtable) 在C++
  • ChatGPT充值,银行卡被拒绝
  • 算法通过村第七关-树(递归/二叉树遍历)白银笔记|递归实战
  • 抖音小程序开发教学系列(6)- 抖音小程序高级功能
  • SpringBoot运行原理
  • 为什么Proteus串口无法正常显示
  • Furion api npm web vue混合开发
  • 【搭建私人图床】本地PHP搭建简单Imagewheel云图床,在外远程访问
  • BOM操作
  • 【校招VIP】前端操作系统之存储管理加密
  • windows 下载安装 mysql
  • 第14章_瑞萨MCU零基础入门系列教程之QSPI
  • 【pygame】01 pygame制作游戏的最小系统
  • (文末赠书)我为什么推荐应该人手一本《人月神话》
  • 回文串 rust解法
  • echarts常用参数详解汇总(饼图,柱形图,折线图)持续更新中
  • 最新ChatGPT网站源码+支持GPT4.0+支持Midjourney绘画+支持国内全AI模型
  • 【MySQL】基础SQL语句——库的操作