【重拾C语言】十二、C语言程序开发(穷举与试探——八皇后问题)

news2024/11/25 1:04:34

目录

前言

十二、C语言程序开发

12.1~3 自顶向下、逐步求精;结构化程序设计原则;程序风格

12.4 八皇后——穷举与试探

12.4.1 穷举法

示例:寻找一个整数的平方根

12.4.2 试探法

示例:计算给定数字的阶乘

12.4.3 穷举与试探(八皇后问题)-递归实现


前言

        八皇后问题是一个经典的计算机科学问题,要求在一个8×8的棋盘上放置8个皇后,使得它们互相之间不能攻击到对方。这个问题可以通过穷举和试探的方法来解决。

  • 穷举法是一种解决问题的方法,它通过尝试所有可能的解决方案来找到满足条件的解。这种方法适用于解空间较小的问题,例如八皇后问题、0/1 背包问题等。在 C 语言中,我们可以通过编写循环来遍历所有可能的解决方案,并判断是否满足条件。
  • 试探法是一种基于经验或启发式规则的方法,它通过逐步搜索解空间来找到满足条件的解。这种方法适用于解空间较大或问题具有启发式特征的情况。在 C 语言中,我们可以通过编写递归或循环来实现试探法,例如深度优先搜索(DFS)或广度优先搜索(BFS)。

十二、C语言程序开发

12.1~3 自顶向下、逐步求精;结构化程序设计原则;程序风格

【重拾C语言】十二、C语言程序开发(自顶向下、逐步求精;结构化程序设计原则;程序风格)_QomolangmaH的博客-CSDN博客icon-default.png?t=N7T8https://blog.csdn.net/m0_63834988/article/details/133825033?spm=1001.2014.3001.5502        在C语言程序开发中,可以使用自顶向下、逐步求精的方法解决问题,遵循结构化程序设计原则,同时注重良好的程序风格,这可以帮助开发者编写可读性强且易于维护的代码。

12.4 八皇后——穷举与试探

12.4.1 穷举法

        穷举法(Exhaustive Search)是一种常见的算法设计方法,用于在给定的搜索空间中尝试所有可能的解决方案,以找到满足特定条件的解。

  • 在C语言中,可以使用循环结构和条件语句来实现穷举法。一般步骤如下:
    • 定义问题的搜索空间和解的表示方式。
    • 使用循环结构遍历搜索空间中的所有可能解。
    • 对于每个可能解,使用条件语句判断是否满足问题的条件。
    • 如果满足条件,执行相应的操作,例如输出结果或保存解决方案。
    • 继续循环,直到遍历完整个搜索空间。
  • 示例:寻找一个整数的平方根
#include <stdio.h>

int main() {
    int num;
    printf("Enter a number: ");
    scanf("%d", &num);

    int i;
    for (i = 0; i <= num; i++) {
        if (i * i == num) {
            printf("Square root of %d is %d\n", num, i);
            break;
        }
    }

    if (i > num) {
        printf("No square root found for %d\n", num);
    }

    return 0;
}

        通过循环遍历从0到输入的数字,逐个尝试每个可能的平方根。如果找到一个平方根,就输出结果并结束循环。如果循环结束后仍然没有找到平方根,就输出相应的提示信息。

输出:

        这只是一个简单的示例,实际上,穷举法可以应用于各种问题,包括组合优化、密码破解等。但是需要注意的是,穷举法的计算复杂度通常较高,随着搜索空间的增大,计算时间会呈指数级增长。因此,在实际应用中,需要根据问题的规模和要求,权衡计算时间和解的准确性。

12.4.2 试探法

        试探法(Backtracking)是一种基于经验或启发式规则的方法,它通过逐步搜索解空间来找到满足条件的解。通常通过递归的方式进行搜索,尝试每一种可能的选择,并在满足条件的情况下继续向下搜索,如果不满足条件,则回溯到上一步选择的状态,重新选择其他可能的路径。

  • 在C语言中,可以使用递归函数和条件语句来实现试探法。一般步骤如下:
    • 定义问题的搜索空间和解的表示方式。
    • 编写一个递归函数,在每一步选择中进行尝试,并根据条件判断是否满足问题的要求。
    • 如果满足条件,执行相应的操作,例如输出结果或保存解决方案。
    • 继续递归调用函数,进入下一步选择。
    • 如果不满足条件,回溯到上一步选择的状态,重新选择其他可能的路径。
    • 继续递归调用函数,进行下一步尝试。
  • 示例:计算给定数字的阶乘
#include <stdio.h>

int factorial(int n) {
    // 基本情况:当 n 为 0 或 1 时,阶乘为 1
    if (n == 0 || n == 1) {
        return 1;
    }
    // 递归情况:调用自身来计算 n 的阶乘
    else {
        return n * factorial(n - 1);
    }
}

int main() {
    int n = 5;
    int result = factorial(n);
    printf("%d 的阶乘为 %d\n", n, result);
    return 0;
}

输出:

        试探法可以应用于各种问题,如组合优化、图的遍历、八皇后问题等。通过不断地试探和回溯,可以找到所有可能的解决方案。请注意,试探法的计算复杂度也可能较高,特别是在搜索空间较大时。因此,在实际应用中,需要谨慎选择搜索策略和剪枝技巧,以提高算法的效率。同时,合理设计问题的表示方式和条件判断,可以帮助减少搜索空间,加快求解过程。

12.4.3 穷举与试探(八皇后问题)-递归实现

     穷举法是一种简单但低效的解决方法,它通过尝试所有可能的皇后布局来找到满足条件的解。具体步骤如下:

  • 从第一行开始,依次尝试在每一列放置皇后。
  • 检查当前的布局是否满足没有皇后互相攻击的条件。
  • 如果满足条件,继续到下一行,重复上述步骤。
  • 如果在某一行无法找到合适的位置放置皇后,回溯到上一行,尝试下一个列。
  • 当放置完最后一行的皇后并且满足条件时,找到一个解。

   穷举法的缺点是需要尝试大量的组合,因此在较大的棋盘上效率较低。

#include <stdio.h>

#define N 8

void printBoard(int board[N][N]) {
    for (int i = 0; i < N; i++) {
        for (int j = 0; j < N; j++) {
            printf("%c ", board[i][j] ? 'Q' : '.');
        }
        printf("\n");
    }
    printf("\n");
}

int isSafe(int board[N][N], int row, int col) {
    // 检查当前位置的左侧是否有皇后
    for (int i = 0; i < col; i++) {
        if (board[row][i]) {
            return 0;
        }
    }

    // 检查当前位置的左上方是否有皇后
    for (int i = row, j = col; i >= 0 && j >= 0; i--, j--) {
        if (board[i][j]) {
            return 0;
        }
    }

    // 检查当前位置的左下方是否有皇后
    for (int i = row, j = col; i < N && j >= 0; i++, j--) {
        if (board[i][j]) {
            return 0;
        }
    }

    return 1;
}
int count = 0; // 全局变量用于计数解的数量
void solveNQueens(int board[N][N], int col) {
    // 所有皇后都放置完毕,打印解决方案,增加解的数量并返回
    if (col == N) {
        printBoard(board);
        count++;
        return;
    }

    // 逐行尝试放置皇后
    for (int i = 0; i < N; i++) {
        if (isSafe(board, i, col)) {
            // 放置皇后
            board[i][col] = 1;

            // 递归地尝试下一列
            solveNQueens(board, col + 1);

            // 回溯,撤销当前位置的皇后
            board[i][col] = 0;
        }
    }
}

int main() {
    int board[N][N] = {0};

    solveNQueens(board, 0);
    printf("Number of solutions: %d\n", count);
    return 0;
}

输出:

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

python教程:selenium WebDriver 中的几种等待

嗨喽&#xff0c;大家好呀~这里是爱看美女的茜茜呐 强制等待:sleep() import time sleep(5) #等待5秒设置固定休眠时间&#xff0c;单位为秒。 由python的time包提供, 导入 time 包后就可以使用。 缺点&#xff1a; 不智能&#xff0c;使用太多的sleep会影响脚本运行速度。…

网络安全(黑客)—自学笔记

目录 一、自学网络安全学习的误区和陷阱 二、学习网络安全的一些前期准备 三、网络安全学习路线 四、学习资料的推荐 想自学网络安全&#xff08;黑客技术&#xff09;首先你得了解什么是网络安全&#xff01;什么是黑客&#xff01; 网络安全可以基于攻击和防御视角来分类…

Jmeter组件执行顺序与作用域

一、Jmeter重要组件&#xff1a; 1&#xff09;配置元件---Config Element&#xff1a; 用于初始化默认值和变量&#xff0c;以便后续采样器使用。配置元件大其作用域的初始阶段处理&#xff0c;配置元件仅对其所在的测试树分支有效&#xff0c;如&#xff0c;在同一个作用域的…

【机组】计算机系统组成课程笔记 第三章 微体系结构层 —— CPU的构成

3.1 CPU的组成和功能 3.1.1 CPU的组成 CPU&#xff08;中央处理单元&#xff09;由寄存器组、算术逻辑单元&#xff08;ALU&#xff09;、控制器&#xff08;CU&#xff09;及内部总线构成。 3.1.2 CPU的功能 CPU通过程序指令的执行&#xff0c;控制各部件协调工作&#xff…

德思特新闻 | 虹科荣获“优秀核心零部件企业”认证

虹科在2023汽车智能与网联技术国际学术会议中荣获了中国智能网联汽车行业“优秀核心零部件企业&#xff08;‘感知与定位’类别&#xff09;”认证。 关于德思特 虹科集团旗下德思特公司是电子测试测量领域内领先的解决方案供应商。主要业务范围涵盖&#xff1a;汽车电子仿真…

vue-element-admin—登录页面添加自定义背景

一、效果图 初始效果&#xff1a; 更改背景后效果&#xff1a; 二、操作步骤 1、准备图片 2、更改代码 打开下面路径的 index.vue 文件&#xff1a; vue-element-admin-master\src\views\login\index.vue 也就是登录页面。 对 .login-container 样式代码块内代码做如下…

print() 函数

二、print() 函数 这里先说一下 print() 函数&#xff0c;如果你是新手&#xff0c;可能对函数不太了解&#xff0c;没关系&#xff0c;在这里你只要了解它的组成部分和作用就可以了&#xff0c;后面函数这一块会详细说明的。 print() 函数由两部分构成 &#xff1a; 指令&a…

解决报错:export ‘default‘ (imported as ‘Register‘) was not found

报错如下&#xff1a; 原因&#xff1a;export default跟index.ts中的export * from "xxx" 冲突了 换句话说&#xff1a;用了export default就不能使用index.ts方式来导入 解决办法&#xff1a; 1. 如果使用export default&#xff0c;就不要使用index.ts的export …

ABB机器人RWS连接方法

目录 方法一&#xff1a;curl 方法二&#xff1a;网页地址 方法三&#xff1a;Postman 与ABB机器人通讯&#xff0c;较新机器人&#xff0c;可以使用Robot Web Services&#xff0c;直接方便地使用网页进行查看当前数据&#xff0c;但是网页需要用户名密码验证&#xff0c;测…

macbook电脑删除app怎么才能彻底清理?

macBook是苹果公司推出的一款笔记本电脑&#xff0c;它的操作系统是macOS。在macBook上安装的app可能会占用大量的存储空间&#xff0c;因此&#xff0c;当我们不再需要某个app时&#xff0c;需要将其彻底删除。macbook删除app&#xff0c;怎么才能彻底呢&#xff1f;本文将给大…

MMU如何通过虚拟地址找到物理地址-下

接着上文&#xff1a;MMU如何通过虚拟地址找到物理地址? 5&#xff0c;虚拟内存到物理内存的推导 本文只介绍最普遍的64位地址&#xff0c;四级页表&#xff0c;每个页表4k的这种情况。 linux内核将一个进程的内存映射表建立好之后&#xff0c;在该进程被调度运行的时候&#…

Lock使用及效率分析(C#)

针对无Lock、Lock、ReadWriterLock、ReadWriterLockSlim四种方式&#xff0c;测试在连续写的情况下&#xff0c;读取的效率&#xff08;原子操作Interlocked由于使用针对int,double等修改的地方特别多&#xff0c;而且使用范围受限&#xff0c;所以本文章没有测试&#xff09; …

【高级交换技术】配置QinQ终结子接口接入VLL示例

简介 VLL是建立在MPLS技术上的点到点二层隧道技术&#xff0c;可以在MPLS骨干网上透明传输二层数据&#xff0c;从而使得位于不同物理位置的属于同一个VLAN的站点之间可以相互通信。 QinQ终结子接口接入VLL是指在报文通过VLL网络传输前&#xff0c;先由设备上的路由子接口对设…

【数据分享】2022年我国30米分辨率的坡向数据(免费获取)

地形数据&#xff0c;也叫DEM数据&#xff0c;是我们在各项研究中最常使用的数据之一。之前我们分享过2022年哥白尼30米分辨率的DEM高程数据&#xff0c;该数据被公认为是全球最佳的开源DEM数据之一&#xff0c;甚至没有之一&#xff08;可查看之前的文章获悉详情&#xff09;&…

Map中的那些事

Map中的那些事 Map中的那些事拓展时间复杂度O(1):常数级O(logn):对数级O(n):线性级O(nlog n):线性对数级O(n):平方级O(n):立方级O(2的n次方):指数级 hashMaphashMap基本知识哈希冲突的定义hashMap的实现原理hashMap有四个构造器 具体问题HashMap的内部数据结构HashMap允许空键空…

MySQL的各种锁

1. MySQL有遇到过死锁的问题吗&#xff1f;你是如何解决的&#xff1f; 死锁&#xff0c;就是两个或两个以上的线程在执行过程中&#xff0c;去争夺同一个共享资源导致互相等待的现象&#xff0c;在没有外部干预的情况下&#xff0c;线程会一直处于阻塞状态&#xff0c;无法往下…

自动化办公篇之python批量改名

#批量命名 import xlwings as xw app xw.App(visibleFalse,add_bookFalse) workbook app.books.open("测试表.xlsx") for sheet in workbook.sheets:sheet.namesheet.name.replace("彩印之","银河") workbook.save() app.quit()

一篇文章带你用动态规划解决打家劫舍问题

动态规划的解题步骤可以分为以下五步&#xff0c;大家先好好记住 1.创建dp数组以及明确dp数组下标的含义 2.制定递推公式 3.初始化 4.遍历顺序 5.验证结果 根据打家劫舍的题意&#xff1a;两个直接相连的房子在同一天晚上被打劫会触发警报 所以我们制定出核心策略——偷东…

Generalizable NeRF in ICCV‘23

文章目录 前置知识Generalizable《Enhancing NeRF akin to Enhancing LLMs: Generalizable NeRF Transformer with Mixture-of-View-Experts》《WaveNeRF: Wavelet-based Generalizable Neural Radiance Fields》NeO 360: Neural Fields for Sparse View Synthesis of Outdoor …

习题2.18

有点烦了&#xff0c;改个次序做题发博文。今天先发2.18 题目很简单 将列表反序。用clojure来写&#xff0c;还是有点不习惯。忽然想起来&#xff0c;以前面试遇到过面试题&#xff0c;要求用递归函数对数组反序。原来就是想考察这些内容。 因为源语言已经有提供reverse&#…