螺旋数组排序

从零到一:RT-Thread与W5500的硬件抽象层设计哲学与实践启示 本文深入探讨了RT-Thread操作系统下W5500以太网模块的硬件抽象层(HAL)设计哲学与实践。通过GD32F103和STM32F103平台的适配案例,详细阐述了如何利用RT-Thread的驱动框架实现跨平台硬件无关性、模块化设计及配置定制,为嵌入式开发者提供了可复用的HAL设计方法论和实战经验。 阅读详情

问题描述:

有一个二维数组,将它每个元素按照螺旋方式排序

比如原始数组如下
在这里插入图片描述

排序后的结果为:
在这里插入图片描述

代码

#include "stdlib.h"

#include "stdio.h"

//#define M 21
//#define N 17

void print(int ** arr, int x_size, int y_size)
{
  int i = 0, j = 0;
  for(i = 0; i < x_size; i++){
     for(j = 0; j < y_size; j++){
        printf("%03d ", arr[i][j]);
     }
     printf("\n");
   }

}

void ** alloc_arr(int x_size, int y_size)
{
  int ** ret;
  ret = (int**)malloc(x_size * sizeof(int*));
  int i = 0;
  for(i = 0; i < x_size; i++){
    ret[i] = (int*)malloc(y_size * sizeof(int));
  }

  return ret;
}

void free_arr(void ** arr, int x_size, int y_size)
{
  int i = 0;
  for(i = 0; i < x_size; i++){
    free(arr[i]);
  }

  free(arr);
}


void turns_arr(int ** arr1, int pos, int m, int n,  int **arr2, int top, int bottom, int left, int right)
{
   int index = 0;
   if(top==bottom&&left==right){
      int x1 = pos/n;
      int y1 = pos-x1*n;
      arr2[top][left] = arr1[x1][y1];
      return;
   }
   //printf("top=%d,bottom=%d,left=%d,right=%d\n", top,bottom,left,right);
   for(index = 0; index+pos < m*n; index++){
      int x1 = (pos+index)/n;
      int y1 = (pos+index-x1*n);
      //printf("x1=%d,y1=%d\n",x1,y1);
      int x2,y2;
      int x_size = bottom-top;
      int y_size = right-left;
      if(index < y_size){
         //printf("top\n");
         x2 = top;
         y2 = left+index;
      }else if(index < x_size+y_size){
         //printf("right\n");
         x2 = index-y_size+top;
         y2 = right;
      }else if(index < 2*y_size+x_size){
         //printf("bottom\n");
         x2 = bottom;
         y2 = right-(index-x_size-y_size);
      }else if(index < 2*x_size+2*y_size){
         //printf("left\n");
         x2 = bottom-(index-2*y_size-x_size);
         y2 = left;
      }else{
        if(bottom-top==1 || right-left==1){
          return;
        }
        top+=1,bottom-=1,left+=1,right-=1;
        turns_arr(arr1, pos+index, m, n, arr2, top, bottom, left, right);
        break;
      }
      //printf("x2=%d,y2=%d\n", x2, y2);
      arr2[x2][y2] = arr1[x1][y1];
   }

}

void main(int argc, char ** argv)
{
   int **a, **b;
   if(argc < 3){
     return;
   }
   int M = atoi(argv[1]);
   int N = atoi(argv[2]);
   if(M == 0 || N == 0){
     return;
   }
   a = alloc_arr(M, N);
   b = alloc_arr(M, N);

   int i = 0, j = 0;
   int k = 1;
   for(i = 0; i < M; i++){
     for(j = 0; j < N; j++){
       a[i][j] = k++;
     }

   }

   print(a, M, N);
   //printf("=========================================================\n");
   for(i = 0; i < N*4-1; i++)
     printf("=");
   printf("\n");

   turns_arr(a, 0, M, N, b, 0, M-1, 0, N-1);
   print(b, M, N);
   //释放a,b
   free_arr(a, M, N);
   free_arr(b, M, N);
}

演示结果:
gcc -o AAA main.c
在这里插入图片描述

去面试游戏测试工程师,面试官看着我的简历呆住了 !我个人整理了我这几年软件测试生涯整理的一些技术资料,包含:电子书,简历模块,各种工作模板,面试宝典,自学项目等。欢迎大家点击下方名片免费领取,千万不要错过哦。 阅读详情

相关推荐

基于 VS Code + CMake + Make + GNU工具链 + OpenOCD 的通用MCU开发环境搭建教程

以CH32V307(RISCV)和STM32F103(Cortex-M3)为例的Vscode+gnu单片机环境搭建。

余十三_的博客 2177

C++语言实现螺旋队列

C++语言实现螺旋队列

Paul的博客 1077

Autosar结合simulink的汽车应用层软件开发实例

本文基于汽车应用开发案例,并结合Autosar相关知识,生成具有Autosar标准的汽车应用层开发代码,以供学习和参考。以上就是本篇内容,主要是利用Simulink创建Autosar接口并进行端口映射的方法。

m0_64899535的博客 2152

螺旋式排列数组

螺旋式排列数组

Ambitious3376的博客 1696

ESP32小车DIY:从零搭建无线遥控智能车(附完整代码与避坑指南)

本文详细介绍了如何从零开始DIY一台基于ESP32的无线遥控智能小车。内容涵盖核心硬件选型、电路设计、低延迟ESP-NOW无线通信协议的配置与实战,以及双电机差速控制算法与PWM调速的实现。文章提供了完整的代码示例和关键的避坑指南,旨在帮助开发者快速构建稳定可靠的智能车平台,并为进一步的功能扩展奠定基础。

gamma的博客 471

I2C总线原理及总线信号的实现

I2C总线是一种多主机总线,连接IIC总线上的器件分为主机和从机,主机有权发起和结束一次通信,而从机只能被主机呼叫;当总线上有多个主机同时启用总线时,I2C也具备冲突检测和仲裁的功能来防止错误产生;每个连接到IIC总线上的器件都有一个唯一的地址(7bit),且每个器件都可以作为主机也可以作为从机(同一时刻只能有一个主机),总线上的器件增加和删除不影响其他器件正常工作;I2C总线在通信时总线上发送数据的器件为发送器,接收数据的器件为接收器;主要用于近距离(抗干扰能力稍弱),低速的芯片之间的通信(传输视频,带宽

YLG_lin的博客 3943

Leetcode33.搜索旋转排序数组

搜索排序旋转数组 1. 问题描述 整数数组 nums 按升序排列,数组中的值 互不相同 。 在传递给函数之前,nums 在预先未知的某个下标 k(0 <= k < nums.length)上进行了 旋转,使数组变为 [nums[k], nums[k+1], …, nums[n-1], nums[0], nums[1], …, nums[k-1]](下标 从 0 开始 计数)。例如, [0,1,2,4,5,6,7] 在下标 3 处经旋转后可能变为 [4,5,6,7,0,1,2] 。 给你 旋转后

菜到不敢run 167

别再到处找模型了!手把手教你将TI、ADI官网的SPICE模型导入LTspice(附路径避坑指南)

本文详细介绍了如何将TI、ADI官网的SPICE模型导入LTspice的全流程,包括模型获取、路径配置、符号生成等关键步骤,并提供了路径避坑指南。通过实战案例和技巧分享,帮助电子工程师高效利用外部元器件模型进行电路仿真,提升设计效率。

weixin_42535703的博客 406

矩阵螺旋排序

#include "qttesteveryday.h" #include <QtWidgets/QApplication> #include <QVector> #include <stdio.h> #include <vector> #include <string> #include <iostream> #include <sstream> #include <algorithm> using namesp

DFrY的博客 433

RNA-seq分析:Step4(比对)

预处理之后的fastq文件,可以使用HISAT2软件将reads比对至参考基因组上。HISAT2软件将reads比对至参考基因组上的步骤如下:1. 对参考基因组进行建索引。对参考基因组进行预处理,生成索引文件,包括基因组序列的FM索引和SA索引。2. 将原始的reads进行预处理。包括去除接头序列、去除低质量的碱基,以及进行过滤,得到质量较高的、可靠的reads。3. 利用建立的FM索引和SA索引,将处理后的reads与参考基因组进行比对。首先,通过FM索引,快速找到与reads匹配的可能位置;

沉香best的博客 2599

CAN轴控制流【6041,6040】

【代码】CAN轴控制流【6041,6040】

cfqq1989的博客 1783

算法题_二维数组的螺旋排序

接下来我们用C++进行编程: #include<iostream> #include<vector> #include<algorithm> using namespace std; int main() { int M, N; while (cin >> M >> N) { vector<vector<int>>nums(M, vector<int>(N)); .

Rocky Ding相信人工智能、数据科学、商业逻辑、金融工具、终身成长以及顺应时代的潮流会赋予我们超能力。 615

39-OpenLayers多图层切换显示隐藏,支持多个Layer同时显示和隐藏,OpenLayers懒加载瓦片

39-OpenLayers多图层切换显示隐藏,支持多个Layer同时显示和隐藏,OpenLayers懒加载瓦片

fxshy的博客 462

华为笔试:二维数组螺旋排序

#二维数组螺旋排序 题目:输入一个二位数组,将这个二位数据进行螺旋排序输出 输入: 第一行: M,N 第二行开始为二位数组内容 举例: 输入: 3 3 123 456 789 输出: 123 894 765 #include<iostream> #include<vector> #include<algorithm> using namespace std; int main() { int M, N; while (cin >> M &g

weixin_43939632的博客 424

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

【leetcode100】搜索螺旋排序数组

整数数组nums按升序排列,数组中的值。在传递给函数之前,nums在预先未知的某个下标k)上进行了,使数组变为(下标计数)。例如,在下标3处经旋转后可能变为。给你的数组nums和一个整数target,如果nums中存在这个目标值target,则返回它的下标,否则返回-1。你必须设计一个时间复杂度为O(log n)的算法解决此问题。

qq_65509025的博客 323

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

LeetCode 搜索螺旋排序数组

LeetCode搜索螺旋排序数组 题干: 假设按照升序排序的数组在预先未知的某个点上进行了旋转。 ( 例如,数组 [0,1,2,4,5,6,7] 可能变为 [4,5,6,7,0,1,2] )。 搜索一个给定的目标值,如果数组中存在这个目标值,则返回它的索引,否则返回 -1 。 你可以假设数组中不存在重复的元素。 你的算法时间复杂度必须是 O(log n) 级别。 示例: eg1: 输入: nums = [4,5,6,7,0,1,2], target = 0 输出: 4 eg2: 输入: nums = [4,

安陵的博客 889

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

算法刷题-数组排序(图算法、算法高阶)、螺旋矩阵(数组、矩阵)、分发糖果(贪心、数组)

输入:[1,2,2] 输出:4 解释:你可以分别给这三个孩子分发 1、2、1 颗糖果。第三个孩子只得到 1 颗糖果,这已满足上述两个条件。编写一个JavaApplication程序,将随机生成的无序数组使用冒泡排序,将这个混乱的数组变成一个从小到大排列的有序的数组并输出。输入:[1,0,2] 输出:5 解释:你可以分别给这三个孩子分发 2、1、2 颗糖果。个孩子站成了一条直线,老师会根据每个孩子的表现,预先给他们评分。老师想给孩子们分发糖果,有。

write less , do more 1141

[leetcode刷题]D2_数组排序、长度最小子数组、螺旋矩阵

JS,leetcode,代码随想录

weixin_46305444的博客 198

leetcode 搜索旋转排序数组/字符串相乘/全排列/螺旋矩阵/螺旋矩阵II/旋转链表/不同路径

搜索旋转排序数组 题目链接:https://leetcode-cn.com/problems/search-in-rotated-sorted-array/ 想到了二分查找,这个思路稍微复杂了点 class Solution { public: int search(vector<int>& nums, int target) { if(nu...

qq_40123329的博客 329

[题记]搜索螺旋排序数组——LeetCode

假设按照升序排序的数组在预先未知的某个点上进行了旋转。 ( 例如,数组 [0,1,2,4,5,6,7] 可能变为 [4,5,6,7,0,1,2] )。 搜索一个给定的目标值,如果数组中存在这个目标值,则返回它的索引,否则返回 -1 。 你可以假设数组中不存在重复的元素。 ☆:你的算法时间复杂度必须是 O(log n) 级别。 示例 1: 输入: nums = [4,5,6,7,0,1,2], ...

qq_45179876的博客 397

代码随想录算法训练营第二天 |有序数组的排序、长度最小的子数组、螺旋矩阵II

思路:还是关于双指针的思路,但是要注意负数平方根后的结果是否变成最大值,那么数组平方的最大值就在数组的两端,不是最左边就是最右边,不可能是中间。思路:本题有暴力解法,两个for循环但是力扣不一定能通过,时间复杂度太高O(n**2),另一个思路就是。,所谓滑动窗口就是不断调整起始位置和终止位置,寻找最优,利用一个for循环,理解代码随想录文章的解析。: 本题关键还是在转圈的逻辑,在二分搜索中提到的区间定义,在这里又用上了。个正整数的数组和一个正整数。组成的新数组,要求也按。题目:给你一个正整数。

xinzhisuox的博客 126

代码随想录算法训练营第二天 | 977. 有序平方数排序,209.长度最小的子数组,59.螺旋矩阵II

● 自己实现过程中遇到哪些困难。● 自己实现过程中遇到哪些困难。● 自己实现过程中遇到哪些困难。● 看完代码随想录之后的想法。● 看完代码随想录之后的想法。● 看完代码随想录之后的想法。● 自己看到题目的第一想法。● 自己看到题目的第一想法。● 自己看到题目的第一想法。

dreams00的博客 522

c语言二维数组排序_C语言实现螺旋二维数组

没有使用什么算法,就是简单的逻辑实现。思路:通过上下左右四个变量的值个适当控制来,顺序的螺旋操作数组元素的值。代码如下void func(int left,int right,int up,int down,int V) { int i ,j ,k ,l; if(left<=right) //注意递归的边界是left<=right 不要把if写成whil...

weixin_42168341的博客 574

leetcode33.搜索螺旋排序数组——学习笔记

题目:力扣https://leetcode-cn.com/problems/search-in-rotated-sorted-array/ class Solution { public int search(int[] nums, int target) { int left = 0; int right = nums.length-1; while(left<=right){ int mid = (left+rig

Hokachi的博客 515

每日一题:Leetcode-33 搜索螺旋排序数组

力扣题目解题思路java代码。

LIUCHANGSHUO的博客 580

1050. 螺旋矩阵

题目是pat乙级 思路:题目是模拟题。首先对输入的数据排序,然后依次按照左下右上的顺序添入到二维数组中。需要注意两个问题:1)填入时边界如何判断?如果下一个位置已经有数据的怎么办?我处理方法是添加一个框,是的上述两个方面变成同一个问题。2)由于无法确定二维数组大小,因此使用动态数组。申请后,别忘了释放了。 训练目的:排序 二维动态数组

童雅盛儒的博客 376
下一篇: 八皇后问题
date_0413
博客等级 码龄7年 0粉丝 2原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值