【C语言算法】蛇形方阵 暴力破解之(if函数)

文章目录

    • 1. 问题描述
    • 2. 题目分析与代码设计
    • 3. 代码实现
    • 4. 运行效果


1. 问题描述

在n x n(n≤8)方阵里填入1,2,3,…,n x n,要求填成蛇形。
列如 n=4 时方阵为:
在这里插入图片描述

2. 题目分析与代码设计

算法的步骤和分析:

  1. 初始化:首先,创建一个 n x n 的二维数组 array,并将所有元素初始化为0。同时,初始化一个计数器 count 用于填充数组,初始值为1。

  2. 设定起始位置:设置起始位置为方阵的右上角,即 i = 0(第一行)和 j = n - 1(最后一列)。

  3. 定义方向:使用一个变量 fangxiang 来表示当前的填充方向。初始方向向下,即 fangxiang = 1。方向可以是:向下(1)、向左(2)、向上(3)、向右(0)。

  4. 填充循环:使用一个 while 循环,当 count 小于或等于 n*n 时,继续填充方阵。在每次循环中,将 count 的值填充到当前的 i, j 位置,然后递增 count

  5. 方向控制:根据当前的方向,决定下一个填充位置。如果当前方向上已经无法继续填充(即到达边界或该位置已被填充),则改变方向。具体规则如下:

    • 向下(fangxiang == 1):如果到达最下行或下一行已填充,改变方向向左。
    • 向左(fangxiang == 2):如果到达最左列或前一列已填充,改变方向向上。
    • 向上(fangxiang == 3):如果到达最上行或前一行已填充,改变方向向右。
    • 向右(fangxiang == 0):如果到达最右列或下一列已填充,改变方向向下。
  6. 移动到下一个位置:根据当前方向,更新 ij 的值,以移动到下一个填充位置。

  7. 打印方阵:当所有元素都被填充后,使用嵌套的 for 循环打印出整个方阵。

3. 代码实现

#include <stdio.h>

int main() {
    int n;
    // 提示用户输入方阵的大小
    printf("请输入方阵的大小n: ");
    scanf("%d", &n);

    int array[n][n];
    int count = 1;
    int i, j;

    // 初始化数组,将所有元素设置为0
    for (i = 0; i < n; i++) {
        for (j = 0; j < n; j++) {
            array[i][j] = 0;
        }
    }

    // 设置起始位置为矩阵的右上角
    i = 0; //起始行
    j = n - 1; //起始列
    
    // 定义方向变量,1代表向下,2代表向左,3代表向上,0代表向右
    int fangxiang = 1;

    // 当填充的数值小于等于n*n时继续填充
    while (count <= n * n) {
        // 填充当前位置的值,并递增计数器
        array[i][j] = count++;
        
        // 根据当前方向,决定下一步的移动
        if (fangxiang == 1) { // 向下
            if (i == n - 1 || array[i + 1][j] != 0) { // 如果到达最下行或下一行已填充
                fangxiang = 2; // 改变方向向左
                j--; // 移动到前一列
            } else {
                i++; // 移动到下一行
            }
        } else if (fangxiang == 2) { // 向左
            if (j == 0 || array[i][j - 1] != 0) { // 如果到达最左列或前一列已填充
                fangxiang = 3; // 改变方向向上
                i--; // 移动到前一行
            } else {
                j--; // 移动到前一列
            }
        } else if (fangxiang == 3) { // 向上
            if (i == 0 || array[i - 1][j] != 0) { // 如果到达最上行或前一行已填充
                fangxiang = 0; // 改变方向向右
                j++; // 移动到下一列
            } else {
                i--; // 移动到前一行
            }
        } else if (fangxiang == 0) { // 向右
            if (j == n - 1 || array[i][j + 1] != 0) { // 如果到达最右列或下一列已填充
                fangxiang = 1; // 改变方向向下
                i++; // 移动到下一行
            } else {
                j++; // 移动到下一列
            }
        }
    }
    
    printf("\n");
    for (i = 0; i < n; i++) {
        for (j = 0; j < n; j++) {
            printf("%-6d", array[i][j]); 
        }
        printf("\n"); 
    }

    return 0;
}

4. 运行效果

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/925379.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

从覆盖到拼接:优化 onInput 事件的输入

在使用 ElSelect 组件的 onInput 事件时&#xff0c;由于每次输入都触发搜索&#xff0c;导致请求频繁且新搜索结果覆盖了旧结果&#xff0c;无法实现输入数据的累积搜索。我们希望的是&#xff0c;每次搜索能够将新的输入内容与之前的内容拼接显示&#xff0c;从而实现用户的诉…

Flink四大基石之CheckPoint

1、State Vs Checkpoint State:状态,是Flink中某一个Operator在某一个时刻的状态,如maxBy/sum,注意State存的是历史数据/状态,存在内存中。 Checkpoint:快照点, 是Flink中所有有状态的Operator在某一个时刻的State快照信息/存档信息。 一句话概括: Checkpoint就是State的快照…

如何给GitHub的开源项目贡献PR

&#x1f3af;导读&#xff1a;本文详细介绍了如何向开源项目“代码随想录”贡献自己的题解。首先&#xff0c;需要Fork原项目的仓库至个人GitHub账户&#xff0c;然后解决克隆仓库时可能遇到的SSH密钥问题。接着&#xff0c;按照标准流程对本地仓库进行代码或文档的修改&#…

不可分割的整体—系统思考的微妙法则

不可分割的整体——系统思考的微妙法则 作为企业领导者&#xff0c;我们经常需要做出决策&#xff0c;但有时候&#xff0c;我们会忽略一个事实&#xff1a;每个决策都不是孤立的&#xff0c;它背后都是一个复杂系统的一部分。 无论是市场动态、团队协作&#xff0c;还是产品…

layui-vue第三方库表格列事件怎么写

插槽写入列点击事件 <div class"le-table-box" ref"TableBoxRef" :style"{ height: ShowPage ? calc(100% - 60px) : 100% }"><lay-table row-double"dbRowClick" :columns"TableColumn" :data-source"Table…

第一个 C++ 程序 001

1. main 函数 同 c 语言的 main 函数 2. 字符和字符串 在C的 STL 中⼜引⼊了 string 来表⽰字符串&#xff0c;功能更加强⼤&#xff0c;C 语⾔不⽀持&#xff0c;后期会详细介绍。 其他的和 c 语言类似 3. 头文件 和 C 语言中的头文件一样&#xff0c;相当于一个工具箱 不过…

修改插槽样式,el-input 插槽 append 的样式

需缩少插槽 append 的 宽度 方法1、使用内联样式直接修改&#xff0c;指定 width 为 30px <el-input v-model"props.applyBasicInfo.outerApplyId" :disabled"props.operateCommandType input-modify"><template #append><el-button click…

Hot100 - 搜索二维矩阵II

Hot100 - 搜索二维矩阵II 最佳思路&#xff1a; 利用矩阵的特性&#xff0c;针对搜索操作可以从右上角或者左下角开始。通过判断当前位置的元素与目标值的关系&#xff0c;逐步缩小搜索范围&#xff0c;从而达到较高的效率。 从右上角开始&#xff1a;假设矩阵是升序排列的&a…

杂七杂八的网络安全知识

一、信息安全概述# 1.信息与信息安全# 信息与信息技术 信息奠基人&#xff1a;香农&#xff1a;信息是用来消除随机不确定性的东西 信息的定义&#xff1a;信息是有意义的数据&#xff0c;是一种要适当保护的资产。数据经过加工处理之后&#xff0c;就成为信息。而信息需要…

Vision Transformer(vit)的Embedding层结构

代码&#xff1a; class PatchEmbed(nn.Module):"""2D Image to Patch Embedding"""def __init__(self, img_size224, patch_size16, in_c3, embed_dim768, norm_layerNone):super().__init__()img_size (img_size, img_size) #图像尺寸默认22…

Spring Boot 实战:基于 Validation 注解实现分层数据校验与校验异常拦截器统一返回处理

1. 概述 本文介绍了在spring boot框架下&#xff0c;使用validation数据校验注解&#xff0c;针对不同请求链接的前端传参数据&#xff0c;进行分层视图对象的校验&#xff0c;并通过配置全局异常处理器捕获传参校验失败异常&#xff0c;自动返回校验出错的异常数据。 2. 依赖…

Linux查看网络基础命令

文章目录 Linux网络基础命令1. ifconfig 和 ip一、ifconfig命令二、ip命令 2. ss命令一、基本用法二、常用选项三、输出信息四、使用示例 3. sar 命令一、使用sar查看网络使用情况 4. ping 命令一、基本用法二、常用选项三、输出结果四、使用示例 Linux网络基础命令 1. ifconf…

Python酷库之旅-第三方库Pandas(245)

目录 一、用法精讲 1156、pandas.tseries.offsets.MonthEnd.is_month_start方法 1156-1、语法 1156-2、参数 1156-3、功能 1156-4、返回值 1156-5、说明 1156-6、用法 1156-6-1、数据准备 1156-6-2、代码示例 1156-6-3、结果输出 1157、pandas.tseries.offsets.Mon…

DAMODEL丹摩|Faster-Rcnn训练与部署实战

本文仅做测评体验&#xff0c;非广告。 文章目录 1. 丹摩介绍2. Faster-Rcnn介绍3. 准备3. 1 丹摩平台准备实例 3. 2 Faster-Rcnn4. 部署开始5. 训练5. 资源释放6. 结语 1. 丹摩介绍 详细介绍请看&#xff1a;丹摩平台介绍。 丹摩智算平台&#xff08;DAMODEL&#xff09;是…

NLP信息抽取大总结:三大任务(带Prompt模板)

信息抽取大总结 1.NLP的信息抽取的本质&#xff1f;2.信息抽取三大任务&#xff1f;3.开放域VS限定域4.信息抽取三大范式&#xff1f;范式一&#xff1a;基于自定义规则抽取&#xff08;2018年前&#xff09;范式二&#xff1a;基于Bert下游任务建模抽取&#xff08;2018年后&a…

LLM*:路径规划的大型语言模型增强增量启发式搜索

路径规划是机器人技术和自主导航中的一个基本科学问题&#xff0c;需要从起点到目的地推导出有效的路线&#xff0c;同时避开障碍物。A* 及其变体等传统算法能够确保路径有效性&#xff0c;但随着状态空间的增长&#xff0c;计算和内存效率会严重降低。相反&#xff0c;大型语言…

C#基础题总结

16.一张单据上有一个5位数的号码为6**42&#xff0c;其中百位数和千位数已模糊不清&#xff0c;但知道该数能被 57 和 67 除尽。设计一个算法&#xff0c;找出该单据所有可能的号码。 17.编程序求2&#xff5e;10000以内的完全数。一个数的因子&#xff08;除了这个数本身&…

Android数据存储——文件存储、SharedPreferences、SQLite、Litepal

数据存储全方案——详解持久化技术 Android系统中主要提供了3中方式用于简单地实现数据持久化功能&#xff0c;即文件存储、SharedPreference存储以及数据库存储。除了这三种方式外&#xff0c;还可以将数据保存在手机的SD卡中&#xff0c;不给使用文件、SharedPreference或者…

【动手学电机驱动】STM32-FOC(8)MCSDK Profiler 电机参数辨识

STM32-FOC&#xff08;1&#xff09;STM32 电机控制的软件开发环境 STM32-FOC&#xff08;2&#xff09;STM32 导入和创建项目 STM32-FOC&#xff08;3&#xff09;STM32 三路互补 PWM 输出 STM32-FOC&#xff08;4&#xff09;IHM03 电机控制套件介绍 STM32-FOC&#xff08;5&…

ubuntu 安装proxychains

在Ubuntu上安装Proxychains&#xff0c;你可以按照以下步骤操作&#xff1a; 1、更新列表 sudo apt-update 2、安装Proxychains sudo apt-get install proxychains 3、安装完成后&#xff0c;你可以通过编辑/etc/proxychains.conf文件来配置代理规则 以下是一个简单的配置示例&…