回溯法--符号三角形(杂记)

文章介绍了如何使用回溯法解决符号三角形的问题,其中符号三角形的规则是同号下面为+,异号下面为-。通过异或运算简化问题,并利用DFS进行深度优先搜索,同时应用剪枝策略优化搜索过程。在回溯过程中,通过维护+和-的数量来确保约束条件得到满足。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

回溯法说来简单,写起来难,真的是要愁死。

回溯法有两种模板--子集树、排列树

5.4符号三角形--dfs

计算多少个满足条件的符号三角形,同号下面为“+”,异号下面为“-”。

根据异或的规则我们令“+”=0,“-”=1,(异或的运算规则:相同取0,相异取1)正好异或的规则满足题意,并且方便计数。

0^0=0

0^1=1

1^1=0

1^0=1

我们知道,第一行的符号确定了,后面的都确定了。所以需要遍历第一行的所有的“+”号和“-”号。

第一行一共有n和符号,变幻每个位置的符号,就是个叶子。

观察发现:满足条件的所有三角形中除了初始n=3个字符的三角形,其他所有满足结果要求的子三角形中,+和-的个数都是相同的。(但是最后输出的时候n=3有四种结果,也是对的,不知道为什么我第一次想的时候,这个n=3怎么不对了,可能是脑子有点小毛病)

下面列出n=3的四种情况

0 0 1

0 1

1

+ + -

+ -

-

0 1 0

1 1

0

+ - +

- -

+

1 0 0

1 0

1

- + +

- +

-

1 1 1

0 0

0

- - -

+ +

+

回溯的主要思想:

用n元组x[1:n]表示符号三角形的第一行的n个符号,当x[i]=1时,表示符号三角形的第一行的第i个符号为“+”;当x[i]=0时,表示符号三角形的第一行的第i个符号为“-”;1<=i<=n。

由于x[i]是二值的。所以在用回溯法解符号三角形问题时,可以用一棵完全二叉树来表示其解空间。

在符号三角形的第一行的前i个符号x[1:i]确定后,就确定了一个有i(i+1)/2个符号组成的符号三角形。

下一步确定x[i+1]的值后,只要在前面已确定的符号三角形的右边加一条边,就可以拓展为x[1:i+1]所对应的符号三角形。最终由x[1:n]所确定的符号三角形包含的“+”个数与“-”同为n(n+1)/4.

因此,在回溯可将“+”、“-”个数均不超过n(n+1)/4为约束条件。

同时,对于给定的n当n(n+1)/2为奇数时,显然不存在“+”和“-”个数相同的符号三角形。

剪枝:不等的直接return,如果cnt>half || (t*(t-1)/2-cnt)>half,当前的第一行第t个符号以前所对应的三角形,减号的个数大于一半了或者是加号的个数大于一半了都直接return。另外一个是要特判初始的总数,奇数肯定是不行的。

然后注意回溯的时候对sum值进行修改。剩下的就是dfs深度优先搜索的功底了。

主要界面预览:http://blog.youkuaiyun.com/xiaozaq/article/details/78399316 系统主要功能介绍: 实验室预约管理系统主要有2个使用角色:管理员和学生 管理员模块: 1.学生信息管理。添加了学生用户,学生才能使用工号和初始密码登录系统。首次登录系统后需要修改密码。 实体主要属性:学生id,学号,学生姓名,性别,班级。 2.教师信息管理。添加教师信息,与实验项目批次关联。教师与实验项目批次是一对多的关系。 实体主要属性:教师id,教师姓名,性别,所属院系。 3.管理员信息管理。添加管理员用户。管理员用户有管理员模块的所有操作权限。 实体主要属性:管理员id,姓名,性别,所属院系。 4.学期管理。学期和实验项目是一对多的关系。 实体主要属性:学期名称,开始时间,结束时间,是否可用。 5.课程管理。课程和实验项目是一对多的关系。 实体主要属性:课程id,课程名称。 6.实验项目管理。与课程是多对一关系,与学期是多对一关系 实体主要属性:实验项目id,实验项目名称,所属课程id,所属学期。 7.实验项目批次管理。一个实验项目可能有多个批次,由不同的老师指导。每个批次对应一个老师。 实体主要属性:实验批次id,实验项目id,教师id,实验地点,容纳人数,实验日期,节次,是否确认。 8.学生预约申请管理。管理员审核学生预约申请,如容纳人数已满等情况则拒绝学生的预约申请,并填写相应的原因告知学生。 实体主要属性:学生id,实验批次id,申请时间,审核结果,原因,考勤签到。 9.考勤管理。学生预约成功后,管理员根据实验批次学生参与情况进行考勤。便于以后统计。 学生模块: 1.预约实验室。学生预约已确认的项目批次。申请后添加一条学生预约申请记录。 2.取消预约。学生预约申请后,如管理员还未审核,则可以取消预约。审核成功后不能取消。 3.查看我的预约。查看自己的预约申请记录。 说明: 1.该系统是基于ofbiz 16.11.02版本开发的。 2.系统使用的数据库是mysql。(可以使用其他数据库,只要根据搭建ofbiz系统时配置决定。) 安装运行步骤: 1.搭建好ofbiz系统。具体搭建步骤见:http://blog.youkuaiyun.com/xiaozaq/article/details/72763123 2.将解压的文件夹booking复制到apache-ofbiz-16.11.02\hot-deploy目录下。 3.将解压的文件夹lib里的文件复制到apache-ofbiz-16.11.02\lib目录下。 常见问题解决办法: 1.中文乱码等问题解决办法可以查看:ofbiz实战——实验室预约系统导航页 http://blog.youkuaiyun.com/xiaozaq/article/details/78400088
传统的实验室管理方式,积累量大,易出错,在实验室开放方面,学生很难查看实验室的空闲时段,管理员也很难为学生预备实验条件。在选择实验课方面,总是以班级或者专业为单位进行排课,使得教学缺乏自主化,人性化,而且往往会师生之间相互不了解而产生的盲目教学等情况,影响学生、老师的积极性,从而影响实验教学的效果。所以,需要开发一套开放实验室实验预约系统来代替传统的管理方法。 开放实验室预约系统包含管理员放课子系统,老师排课子系统,学生选课子系统三块。在放课子系统中,管理员根据该学期的实际需要发放本学期的实验项目批次,同时管理员可以统计所有实验项目批次的选课情况。在排课子系统中,老师根据管理员发放的实验项目批次,确定实验的时间、地点、容纳人数等基本信息,同时老师可以查看自己排课情况。在选课子系统中,学生根据自己的实际情况和老师排课的基本情况来选择自己的实验项目批次,同时学生可以查询老师的信息,课程的信息和自己的课表。 系统采用B/S架构,符合操作简单,界面友好,灵活,实用,安全的要求,能够完成开放实验室预约管理的全过程。系统的最大特点就是打破了传统意义上的实验室管理方式,使得学生、老师在整个教学过程中更加自主,不断提高了两者的积极性,同时也提高了教与学的质量,提高了实验教学管理的效率。
项目背景:全校开放性实验室预约系统是一个让学生通过网上报名预约实验的系统。由于学生对实验的需求很多,而教师人数有限,这使得学生做实验时遇到问题不能得到及时解决,从而导致实验很难继续下去,这样实验难以达到预期目的。因此,必须准确地了解学生对实验的内容和时间等的要求,才能有效地安排教师辅导。“全校开放性实验室预约系统”通过学生网上预约实验的方式,为实验室妥善安排提供可靠的依据。 使用说明: 学期管理 管理员可以添加、修改、删除学期。 特别注意:只能有一个学期为活动学期,学生只能预约这个学期的实验项目;老师只能查看、编辑这个学期的实验批次。 实验项目管理 一个学期可以有不同的实验科目,一个实验科目又有不同的实验项目。管理员可以添加、修改、删除实验项目。 特别注意:在输入实验项目时,遇到没有在实验科目列表中出现的实验科目,直接手动输入,保存后就自动添加到列表中。 实验项目批次 一个实验项目可以分为不同的实验批次进行。管理员可以针对某个实验项目进行实验批次的添加、修改、删除。一个实验批次,可以有多个学生参与,但不能超过实验批次的容量。管理员可以对某个实验批次里的学生进行添加、评分、删除操作。 老师管理 管理员可以添加、修改、删除老师信息。 特别注意:老师的平台账号不能为空而且不能重复,因为老师登入系统就是用这个账号。 学生管理 管理员可以添加、修改、删除学生信息。 特别注意:学号不能为空而且不能重复.学生登入时候使用学号登入.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值