吉林大学 超星慕课 高级语言程序设计 实验08 结构化程序设计(2022级)

news2024/9/23 19:20:59

本人能力有限,发出只为帮助有需要的人。

建议同学们自己写完后再进行讨论。

其中的代码均没能在oj上进行测试,因此可能有误,请谅解。

除此以外部分题目设计深度优先搜索,因此可以分别用递归和堆栈实现,堆栈方法为了方便是用c++写的。

1. 正整数分解

题目描述:正整数n,按第一项递减的顺序依次输出其和等于n的所有不增的正整数和式。


输入:一个正整数n(0<n≤15)。

输出:每行输出如样例所示,和等于n的不增正整数和式,数字和运算符间无符号,最后一行结尾有一个回车换行符。
 

样例:

输入:
4
输出:
4=3+1
4=2+2
4=2+1+1
4=1+1+1+1
//此题思路为递归解DFS问题
#include<stdio.h>
int n;
int a[100]={0};
int check(int sit);//flag标记拆分的数的下标
void dfs(int x,int sit)//x表示被拆分的数,sit表示被拆分的数在数值中的位置
{
    int i,k;
    for(i=x-1;i>0;i--)//从后向前阅历
    {
        a[sit]=i;
        a[sit+1]=x-i;//将下一位赋值成x-i,实现对数组中sit位置的拆分
        if(check(sit+1))
        {
            int tem=0;
            printf("%d=",n);//注意控制输出格式
            for(int i=0;i<=sit+1;i++)
            {
                if(tem)
                    printf("+");
                tem=1;
                printf("%d",a[i]);
            }
            printf("\n");
        }
        if(a[sit+1]>1)
            dfs(x-i,sit+1);//拆分后的数大于一则递归
    }
}
int check(int sit)//检查是否递减
{
    for(int i=0;i<sit;i++)
        if(a[i]<a[i+1])
            return 0;//如果出现前一位小于后一位则不递增
    return 1;
}
int main(void)
{
	scanf("%d",&n);
    dfs(n,0);//进行深搜操作
	return 0;
}

2. N皇后问题

题目描述:

八皇后问题由高斯(C. F. Gauss)最早在1850年提出并研究,但并未完全解决。N皇后问题指在一个N×N的棋盘上放置N个皇后,使任意两个皇后都不能互相攻击。按国际象棋规则,两个皇后,若在同一行上,或在同一列上, 或在同一条斜线上, 则她们可以互相攻击。下图即满足八皇后条件的一种棋局。

编写程序给出满足条件的棋局数目。

输入:一个正整数N(0<N≤13)输出:棋局数目
样例1:

输入:
2
输出:
0

样例2:

输入:
8
输出:
92

以下是递归写法(C)

#include <stdio.h>
int N;
int num=0;//作为所有可能的计数
int queenSit[10];//N皇后的本质就是一个一维数组(其每个皇后所在的行数不同,不妨设置为递增,所以只需要一维数组表示其列数即可)

int check(int *sit,int step)//检查皇后位置数组是否合法
{
    for(int i=0;i<=step;i++)//截止到有皇后的位置
        for(int j=i+1;j<=step;j++)//二维变量检测
        {
            if(sit[i]==sit[j])//检测时候存在相同元素(即时候一列中有两个皇后)
                return 0;//不用检测一行中是否重复,因为建立时就设置好了不可能重复与=
            else if(sit[i]==sit[j]-(j-i))//j-i为两个元素的距离,此处检测对角线是否重复
                return 0;
            else if(sit[i]==sit[j]+(j-i))//与上面的原理相同
                return 0;
        }
    return 1;//合法返回1
}

void dfs(int *sit,int step)//递归表示DFS(递归的本质与栈相似)
{
    if(step==N)
        num++;//找的合理的解,解法加一  
    int *tmSit=sit;
    if(step<N)
        for(int i=0;i<N;i++)//将下一位的所有可能阅历
        {
            tmSit[step]=i;//构建新的递归元素
            if(check(tmSit,step))//检查时候合理
                dfs(tmSit,step+1);  
        }
}

int main(void)
{    
    scanf("%d",&N);
    for(int i=0;i<N;i++)
    {
        queenSit[0]=i;//此题有N种初始情况,全部阅历
        dfs(queenSit,1);//递归的初始step为1
    }
    printf("%d",num);
    return 0;
}

 以下为堆栈写法(c++)

#include <iostream>
#include <stack>
#include <algorithm>
#include <cstring>//注意memcpy在此头文件中
using namespace std;

int N;//将N设置为全局变量
struct node
{ 
    int sit[10];//八皇后的本质就是一维数组(其每个皇后所在的行数不同,不妨设置为递增,所以只需要一维数组表示其列数即可)
    int step;//表示此时数组中有step+1个皇后
};//用结构体方便些,能间接赋值数组

stack<node>canBe;//DFS核心就是建立堆栈

void buildStart(void)//此题的阅历没有一个指定的起点,所以将可能的8种情况全部放入堆栈之中
{
    int start[N];
    for(int i=0;i<N;i++)//将start初始化使其全部值都为-1
        start[i]={-1};
    for(int i=0;i<N;i++)//将八种情况都放进堆栈之中
    {
        start[0]=i;
        struct node startNode;
        startNode.step=0;
        memcpy(startNode.sit,start,sizeof(start));//数组的复制操作
        canBe.push(startNode);
    }
}

int check(int *sit,int step)//检查皇后位置数组是否合法
{
    for(int i=0;i<=step;i++)//截止到有皇后的位置
        for(int j=i+1;j<=step;j++)//二维变量检测
        {
            if(sit[i]==sit[j])//检测时候存在相同元素(即时候一列中有两个皇后)
                return 0;//不用检测一行中是否重复,因为建立时就设置好了不可能重复与=
            else if(sit[i]==sit[j]-(j-i))//j-i为两个元素的距离,此处检测对角线是否重复
                return 0;
            else if(sit[i]==sit[j]+(j-i))//与上面的原理相同
                return 0;
        }
    return 1;//合法返回1
}

int main(void)
{
    int num=0;
    cin>>N;//输入N
    buildStart();
    while(!canBe.empty())//当堆栈为空此题才跳出循环
    {
        struct node temNode;
        temNode=canBe.top();
        canBe.pop();//用堆栈表示BFS的核心
        if(temNode.sit[N-1]!=-1)//如果最后一位都有元素,则说明构建成功
        {
            num++;//总数加一
            continue;//进行下一轮的while循环
        }
        for(int k=0;k<N;k++)//试探下一行的八个位置
        {
            int temSit[N];
            memcpy(temSit,temNode.sit,sizeof(temSit));
            temSit[temNode.step+1]=k;//将数组的下一位赋值成k
            if(check(temSit,temNode.step+1))//检测是否合理
            {
                struct node newNode;
                newNode.step=temNode.step+1;//皇后个数加一
                memcpy(newNode.sit,temSit,sizeof(temSit));
                canBe.push(newNode);//将新的皇后位置加入堆栈
            }
        }
    }
    cout<<num;
    return 0;
}

3.八皇后本质不同的解

题目描述:

如上题所述,当N=8时,一共有92种可能。如果去除其中上下对称、左右对称棋局、主副对角线对称棋局和旋转后重复棋局,则有12种完全不同的棋局。编写程序,输出这12种棋局。

输入:

输出:

共12行,每行输出1种棋局,

例如,第一行输出 No1:1 5 8 6 3 7 2 4(冒号为西文冒号且前后无多余字符,冒号后的每个数字后均有一个西文空格),

其中No1 表示这是第1种棋局;后续数字序列表示八皇后所在位置,数值本身表示某个皇后在棋盘上的行坐标,该数值所在位置表示该皇后的列坐标(>0),例如,数字5位于序列的第2位,表示棋盘上第5行第2列有一个皇后;数字4位于序列的第8位,表示棋盘上第4行第8列有一个皇后,由此,这8个数字描述了一种棋局。12种棋局的输出顺序:字典序(参考样例)。

样例:

输入:(无)
输出:
No1:1 5 8 6 3 7 2 4
No2:1 6 8 3 7 4 2 5
……(此处省略10行,分别表示No3至No12棋局)

以下为递归写法(c)

#include <stdio.h>

int num=0;//作为所有可能的计数
int queenSit[10];//N皇后的本质就是一个一维数组(其每个皇后所在的行数不同,不妨设置为递增,所以只需要一维数组表示其列数即可)
int flag=0;

int check(int *sit,int step)//检查皇后位置数组是否合法
{
    for(int i=0;i<=step;i++)//截止到有皇后的位置
        for(int j=i+1;j<=step;j++)//二维变量检测
        {
            if(sit[i]==sit[j])//检测时候存在相同元素(即时候一列中有两个皇后)
                return 0;//不用检测一行中是否重复,因为建立时就设置好了不可能重复与=
            else if(sit[i]==sit[j]-(j-i))//j-i为两个元素的距离,此处检测对角线是否重复
                return 0;
            else if(sit[i]==sit[j]+(j-i))//与上面的原理相同
                return 0;
        }
    return 1;//合法返回1
}

void dfs(int *sit,int step)//递归表示DFS(递归的本质与栈相似)
{
    if(step==8)
    {
        num++;//找的合理的解,解法加一
        if(flag)
            printf("\n");
        flag=1;
        printf("No%d.",num);
        for(int i=0;i<8;i++)
        {
            printf("%2d",sit[i]+1);
        }
    }  
    int *tmSit=sit;
    if(step<8)
        for(int i=0;i<8;i++)//将下一位的所有可能阅历
        {
            tmSit[step]=i;//构建新的递归元素
            if(check(tmSit,step))//检查时候合理
                dfs(tmSit,step+1);  
        }
}

int main(void)
{    
    for(int i=0;i<8;i++)
    {
        queenSit[0]=i;//此题有N种初始情况,全部阅历
        dfs(queenSit,1);//递归的初始step为1
    }
    return 0;
}

以下为堆栈写法(c++)

#include <iostream>
#include <stack>
#include <algorithm>
#include <cstring>//注意memcpy在此头文件中
using namespace std;

struct node
{ 
    int sit[8];//八皇后的本质就是一维数组(其每个皇后所在的行数不同,不妨设置为递增,所以只需要一维数组表示其列数即可)
    int step;//表示此时数组中有step+1个皇后
};//用结构体方便些,能间接赋值数组

stack<node>canBe;//DFS核心就是建立堆栈

void buildStart(void)//此题的阅历没有一个指定的起点,所以将可能的8种情况全部放入堆栈之中
{
    int start[8];
    for(int i=7;i>=0;i--)//将start初始化使其全部值都为-1
        start[i]={-1};
    for(int i=7;i>=0;i--)//将八种情况都放进堆栈之中(调整栈中元素位置方便输出)
    {
        start[0]=i;
        struct node startNode;
        startNode.step=0;
        memcpy(startNode.sit,start,sizeof(start));//数组的复制操作
        canBe.push(startNode);
    }
}

int check(int *sit,int step)//检查皇后位置数组是否合法
{
    for(int i=0;i<=step;i++)//截止到有皇后的位置
        for(int j=i+1;j<=step;j++)//二维变量检测
        {
            if(sit[i]==sit[j])//检测时候存在相同元素(即时候一列中有两个皇后)
                return 0;//不用检测一行中是否重复,因为建立时就设置好了不可能重复与=
            else if(sit[i]==sit[j]-(j-i))//j-i为两个元素的距离,此处检测对角线是否重复
                return 0;
            else if(sit[i]==sit[j]+(j-i))//与上面的原理相同
                return 0;
        }
    return 1;//合法返回1
}
int main(void)
{
    int num=0;
    buildStart();
    while(!canBe.empty())//当堆栈为空此题才跳出循环
    {
        struct node temNode;
        temNode=canBe.top();
        canBe.pop();//用堆栈表示BFS的核心
        if(temNode.sit[7]!=-1)//和八皇后问题不同的就是此处输出
        {
            num++;
            cout<<"No"<<num<<".";
            for(int i=0;i<8;i++)
                cout<<temNode.sit[i]+1<<" ";//注意输出格式
            cout<<endl;
            continue;
        }
        for(int k=7;k>=0;k--)//试探下一行的八个位置(调整栈中元素位置方便输出)
        {
            int temSit[8];
            memcpy(temSit,temNode.sit,sizeof(temNode.sit));
            temSit[temNode.step+1]=k;//将数组的下一位赋值成k
            if(check(temSit,temNode.step+1))//检测是否合理
            {
                struct node newNode;
                newNode.step=temNode.step+1;//皇后个数加一
                memcpy(newNode.sit,temSit,sizeof(temNode.sit));
                canBe.push(newNode);//将新的皇后位置加入堆栈
            }
        }
    }
    return 0;
}

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

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

相关文章

JavaScript进阶教程——异步编程、封装Ajax

异步编程 什么是同步与异步&#xff1a; 同步&#xff1a;一件事没做完&#xff0c;只能等待&#xff0c;完成之后再去做另一件事 异步&#xff1a; 两件事可以同时进行 前端开发中最常见的两种异步情况&#xff1a; ajax: 向后台请求数据计时器&#xff1a; setInterval se…

Python学习基础笔记四十一——sys模块

sys模块是与Python解释器交互的一个接口。 sys.argv 命令行参数List&#xff0c;第一个元素是程序本身路径 sys.exit(n) 退出程序&#xff0c;正常退出时exit(0),错误退出sys.exit(1) sys.version 获取Python解释程序的版本信息 sys.path 返…

ARM Cortex M3处理器概述

Cortex-M3概述 2004年ARM发布作为新型Corex处理器内核系列首款的Cortex-M3处理器。 STM32系列基于专为高性能、低成本、低功耗的嵌入式应用专门设计的ARM Cortex-M内核。 STM32命名规则 STMF103xx系统结构 1.使用高性能的ARM Cortex-M3 32位RISC内核 2.工作频率为72MHZ 3.内…

shell脚本监控文件夹文件实现自动上传数据到hive表

sh createtb.sh “tablename;field1,field2,field3,field4,field5,field6,field7;partition1,partition2” 数据库名&#xff1a;observation &#xff08;脚本里写死了&#xff09; 表名&#xff1a;tablename 指定名&#xff1a;field1,field2,field3,field4,field5,field6,f…

分别使用Alpine、Docker制作jdk镜像

目录 制作 jdk 1.0 镜像 ——Docker 1.创建文件夹上传jdk的安装包,和在同级目录下编写Dockerfile文件 2.编写 Dockerfile 文件 3.执行Dockerfile文件&#xff0c;初次依赖镜像的时候会下载相应镜像 优化制作jdk镜像&#xff08;缩小内存大小&#xff09;——使用alpine …

【致敬世界杯】球迷(我)和足球的故事

目录 一、第一次接触足球 二、回味无穷的2018世界杯 三、致敬世界杯 3.1 源代码 3.2 思路 3.3 关于图片 一、第一次接触足球 踢足球是一项优秀的运动&#xff0c;它可以锻炼身体&#xff0c;增强团队合作精神&#xff0c;并为人们带来快乐和满足感。回忆起小学时候第一次…

OpenCV和RTSP的综合研究

一、RTSP是什么&#xff1f;用来干什么&#xff1f; RTSP&#xff08;Real Time Streaming Protocol&#xff09;&#xff0c;RFC2326&#xff0c;实时流传输协议&#xff0c;是TCP/IP协议体系中的一个应用层协议&#xff0c;由哥伦比亚大学、网景和RealNetworks公司提交的IET…

四旋翼无人机学习第14节--PCB Editor简单绘制封装-1

文章目录1 前言1.1 网络获取1.2 封装软件生成1.3 立创商城封装转化1 前言 在之前的博客中&#xff0c;我们绘制了封装所需的焊盘&#xff0c;有了焊盘我们就可以绘制封装啦。当然封装的获取有很多途径&#xff0c;下面我来总结一下。 1.1 网络获取 (有需要的可以下载哦&…

华为eNSP模拟器配置MSTP多实例生成树

传统的stp、rstp有其必然的缺陷 1.统一局域网内所有的vlan共享一个生成树&#xff0c;无法在vlan间实现数据流量的负载均衡。 2.链路利用率低&#xff0c;被阻塞的冗余链路不承载任何流量&#xff0c;造成了带宽的浪费&#xff0c;还可能造成部分vlan报文无法转发。MSTP在它们…

计算机毕业设计springboot+vue基本微信小程序的学习资料共享小程序

项目介绍 前台为用户使用的,包括下面一些功能&#xff1a; ① 资料发布&#xff1a;用户可以将想要共享的资料发布到小程序,供他人购买。 ②搜索 &#xff1a;分为按名称搜索和分类搜索,用户可选择其中一种方式,检索自己所需要的资料。 ③ 查看资料详情&#xff1a;用户可以…

学委必备小工具——筛选未提交人数【python小工具】

问题描述 作为一个学委&#xff0c;通常的任务就是收取班级作业&#xff0c;然后向老师报告当前未交人员的名单 JS版本&#xff1a;实现以一个表格数据查询另一个表格【JS】 之前我已经尝试通过用JS实现了&#xff0c;本质上差别其实也不是很大&#xff0c;只是对于JS来说&…

Java基础之《netty(11)—netty模型》

一、简单说明 1、工作原理示意图 netty主要基于主从Reactors多线程模型做了一定的改进&#xff0c;其中主从Reactor多线程模型有多个Reactor。 2、说明 &#xff08;1&#xff09;BossGroup线程维护selector&#xff0c;只关注Accept事件。 &#xff08;2&#xff09;当接收到…

[附源码]Node.js计算机毕业设计出版社样书申请管理系统Express

项目运行 环境配置&#xff1a; Node.js最新版 Vscode Mysql5.7 HBuilderXNavicat11Vue。 项目技术&#xff1a; Express框架 Node.js Vue 等等组成&#xff0c;B/S模式 Vscode管理前后端分离等等。 环境需要 1.运行环境&#xff1a;最好是Nodejs最新版&#xff0c;我…

第十一章 特征选择与稀疏学习

11.1 子集搜索与评价 我们将属性称为特征&#xff0c;对当前学习任务有用的属性称为相关特征、没什么用的属性称为无关特征。还有一类特征称为冗余特征&#xff0c;它们所包含的信息能从其他特征中推演出来&#xff0c;冗余特征在很多时候不起作用&#xff0c;去除它们会减轻学…

redis之如何应对并发访问问题

写在前面 本文一起看下Redis的并发访问控制。 1&#xff1a;单线程的Redis为什么会有并发问题 我们知道&#xff0c;Redis是单线程的&#xff0c;为什么还是会有并发问题呢&#xff1f;没错&#xff0c;如果是单命令操作的话肯定没有并发问题&#xff0c;但考虑事务的场景&a…

nodejs+vue人事管理系统30n9o

开发语言&#xff1a;nodejs 框架&#xff1a;Express 数据库&#xff1a;mysql 数据库工具&#xff1a;Navicat11 开发软件&#xff1a;VS code 浏览器&#xff1a;谷歌浏览器 目录 1 绪论 1 1.1课题背景 1 1.2课题研究现状 1 1.3初步设计方法与实施方案 2 1.4本文研究内容 …

使用VS2019开发调试Android动态库

1. 环境准备 1.1 安装JDK&#xff1a;jdk1.8.0_112 1.2 安装Android SDK SDK可以安装指定的platforms和ndk-bundle。为了兼容性考虑&#xff0c;单独安装了版本比较老的android-ndk-r10b 1.3 安装VS2019 安装VS2019并选择&#xff1a;使用C的移动开发。 1.4 连接开发手机…

基于Java+Mysql实现(web)大型企业管理系统【100010019】

第一章 系统概述 包括用户管理、权限管理、软件项目管理、软件模块管理、测试用例管理、测试任务分配、bug管理等功能。实现公司不同部门间团队协作&#xff0c;管理人员也能够更加有效的把控系统开发的进度。 本实验综合应用JavaWeb编程中的Servlet&#xff0c;JSP&#xff…

spring——Spring自动装配(基于注解)——前提了解——Spring的@Autowired注解为什么用在接口上 (转载)...

大家都知道Service注入的是实现类serviceImpl&#xff0c;那使用时怎么能获取到接口&#xff0c;而且还能调用到实现类的方法。 接口&#xff1a; public interface TestService{ public String test(); }实现类&#xff1a; Service public class TestServiceImpl imp…

Netty_04_消息协议设计与实战(实践类)

文章目录一、前言二、整体运行&#xff1a;先启动服务端&#xff0c;然后启动客户端&#xff0c;发送三条消息三、客户端和服务端3.1 客户端(重要)3.2 服务端(重要)3.3 编码和解码(了解即可)四、尾声一、前言 源码下载&#xff1a;https://www.syjshare.com/res/XEE10LTG 二、…