符号三角形-计算机算法设计与分析【1600+字解析 dfs全排列 列举情况】【题意分析】【算法分析】【思路是怎么来的】【过程是什么】

这篇具有很好参考价值的文章主要介绍了符号三角形-计算机算法设计与分析【1600+字解析 dfs全排列 列举情况】【题意分析】【算法分析】【思路是怎么来的】【过程是什么】。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

符号三角形问题:在一般情况下,符号三角形的第一行有n个符号。符号三角形问题要求,算法,深度优先,图论

下图是由14个“+”和14个“-”组成的符号三角形。2个同号下面都是“+”,2个异号下面都是“-”。

在一般情况下,符号三角形的第一行有n个符号。符号三角形问题要求对于给定的n,计算有多少个不同的符号三角形,使其所含的“+”和“-”的个数相同。

题意分析

也就是 给了一个n数字

然后就会形成 第一行长度为n的三角形

然后用+ -号 把三角形填充

问是否可以用 + -号相等的数量 进行填充三角形

可以有多少中方案???

思路过程分析

首先我们利用简单的样例分析
如果n=3
然后我们用一行为
+++分析 如果第一行是+++,根据+和-个数相等,剩下的符合只能是—

所以如下
+++
- -
-

如果是

+-+
--
+

++-
-+
-

由上总结出规律就是,如果第一行确定了,那么剩下的行都是根据上一行而确定的

也就是

+++  第一行都是+
第二行 就上 它的左上角和右上角
++-
+-+
-++
--+

根据这个规律就能构图了

所以我们那就先把第一行的所有情况都遍历一边,
然后把每次情况都构图一次,
记录下+ -号的个数
看 + -号是不是各一半

算法分析

我们已经知道 过程了

那么如何 写出算法?

首先由于 要把第一行的所有情况都遍历一边

那么我们就是要用 dfs全排列方法遍历

所以我们用dfs(t)t表示第一行中的位置
构建第一行,

但是我们发现,比如n = 100,t = 20时候,其实是可以把前20个所对应下面的行构建出来,并且如果这种情况下,如果-号或者+号已经大于一半,那么就不可能是这种情况了,就直接剪纸了

比如 n = 3
++未知
-未知
未知

也就是如果知道前两个是++
那么第二行的第一个也就知道了

这样的算法就可以是优化后的算法了

本题的思路 也就差不多了
直接上代码文章来源地址https://www.toymoban.com/news/detail-772588.html

//5-4 符号三角形问题
//0+  1-
#include <iostream>
using namespace std;
int n;//n行,第一行有n个元素 
int sum=0;//记录满足题意的数
int half;//n*(n+1)/4 
int cnt;//'-'的个数
int p[100][100]; //符号三角形矩阵 
void Output(){
	cout<<"------------\n";
	for(int i=1;i<=n;i++){
		for(int j=1;j<=n-i+1;j++){
			cout<<p[i][j]<<" ";
		}
		cout<<endl;
	}
} 
void BackTrack(int t){ //第t行 
//	cout<<"cnt="<<cnt<<" half="<<half<<endl;
	//正负号如果出现 一方>half
	if(cnt>half || (t*(t-1)/2-cnt)>half) return;
	if(t>n){
		Output(); 
		sum++;	
	}
	else{
		for(int i=0;i<=1;i++){
			p[1][t] = i;
			cnt += i;//'-'的个数
			for(int j=2;j<=t;j++){
				p[j][t-j+1] = p[j-1][t-j+1] ^ p[j-1][t-j+2];//^相同取0,不同取1 
				cnt+=p[j][t-j+1];
			}
			BackTrack(t+1);
			for(int j=2;j<=t;j++){
				cnt-=p[j][t-j+1];
			} 
			cnt -= i;
		}
	}
} 
int main(){
	cin>>n;
	half=n*(n+1)/2;//共有n*(n+1)/2个符号 
	
	if(half%2==1){  //奇数个符号的话,不存在'+'的个数等于'-'的个数 
		cout<<"无解\n";
	}
	else{
		half=half/2;
		BackTrack(1);
		cout<<"sum="<<sum<<endl;
	}

	return 0;
} 
/*
7
*/

到了这里,关于符号三角形-计算机算法设计与分析【1600+字解析 dfs全排列 列举情况】【题意分析】【算法分析】【思路是怎么来的】【过程是什么】的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 双指针算法实例5(有效三角形的个数)

    给定一个包含非负整数的数组  nums  ,返回其中可以组成三角形三条边的三元组个数。 示例 1: 示例 2: 提示: 1 = nums.length = 1000 0 = nums[i] = 1000 三角形构成条件:任意两边之和一定要大于第三边 其实在判断中,只需要判断 最小的两边和大于最长的一边 即可 假设 a=b=c 若要构成

    2024年02月11日
    浏览(30)
  • 用动态规划算法编程实现数字三角形问题

    如下所示为一个数字三角形: 7 3 8 8 1 0 2 7 4 4 4 5 2 6 5 请编一个程序计算从顶至底的某一条路径,使该路径所经过的数字的总和最大。 思路:建立两个二位数组m(用来存储数字三角形),sum(用来存储数字三角形中每一个值得路径值);sum[i] [j]从最后一行开始存储; 如果当前

    2024年02月11日
    浏览(47)
  • PCL 计算一个平面与一个三角形的交线

    这里实现一个很有趣的功能,就是获取一个平面与一个三角形的交线,具体的思路很简单,就是借助之前的博客中的思路:Matlab 计算一个平面与一条线段的交点,我们只需要遍历三角形中的所有边即可获取我们想要的交线,这里是PCL版本。

    2024年02月06日
    浏览(28)
  • 贪心算法求数组中能组成三角形的最大周长

    题目:三角形的最大周长 给定由一些正数(代表长度)组成的数组arr,返回由其中三个长度组成的、面积不为零的三角形的最大周长。 如果不能形成任何面积不为零的三角形,返回`0。 分析: 对数组排序,再从大到小选择三个数, 再判断是否能构成三角形,可以直接返回三数之

    2024年02月12日
    浏览(31)
  • 【算法专题突破】双指针 - 有效三角形的个数(5)

    目录 1. 题目解析 2. 算法原理 3. 代码编写 写在最后: 题目链接:611. 有效三角形的个数 - 力扣(Leetcode)  我们可以根据示例1来理解这一道题目, 他说数组里面的数可以组成三角形三条边的个数, 那我们先自己枚举一下所有情况看看:  【2, 2, 3】  【2, 2, 4】  【2,

    2024年02月10日
    浏览(28)
  • pcl matlab 计算平面与空间三角形的交线

     过程: 单有法向量不能确定一个平面,至少还要有平面上的一个点的坐标才行 假如知道法向量n=(A,B,C) 而平面过某点M=(x0,y0,z0) 那么平面的方程为 A(x-x0)+B(y-y0)+C(z-z0)=0 要在图中画出来,那么先要给x,y一个范围 举个离子,平面法向量(1,1,1)过点(0,1,2) 画出x,y在 -2~2区

    2024年02月12日
    浏览(31)
  • 使用Python实现高效数据下采样:详解最大三角形三桶(LTTB)算法

    引言 在我们接触大规模的数据集时,数据的数量往往会让人望而却步。数据分析、机器学习等领域的专业人员需要对这些数据进行处理,以便更好地理解数据,以及利用数据进行预测。然而,处理大规模数据的计算成本往往非常高,这时候,就需要引入下采样(Downsampling)的

    2024年02月14日
    浏览(27)
  • 【算法挨揍日记】day03——双指针算法_有效三角形的个数、和为s的两个数字

       611. 有效三角形的个数 https://leetcode.cn/problems/valid-triangle-number/ 给定一个包含非负整数的数组  nums  ,返回其中可以组成三角形三条边的三元组个数。 本题是一个关于三角形是否能成立的题目,首先我们假设三角形的三边(a,b,c),我们要保证两边之和大于第三边    题

    2024年02月12日
    浏览(31)
  • 算法分析与设计-数字三角形问题(动态规划)(通俗易懂,附源码和图解,含时间复杂度分析)(c++)

    (一)题目 问题描述 给定一个由 n n n 行数字组成的数字三角形,如图所示。 试设计一个算法,计算从三角形的顶至底的一条路径,使该路径经过的数字总和最大。 算法设计 对于给定的由 n n n 行数字组成的数字三角形,计算从该三角形的顶至底的路径经过的数字和的最大值

    2023年04月10日
    浏览(29)
  • 湘大 XTU OJ 1148 三角形 题解(非常详细):根据题意朴素模拟+观察样例分析需要计算几轮 具体到一般

    1148 三角形 题目描述 给一个序列, 按下面的方式进行三角形累加,求其和值 。 比如序列为 1,2,3,4,5 输入 有多组样例。每个样例的第一行是一个整数N( 1≤N≤100 ),表示序列的大小, 如果N为0表示输入结束。这个样例不需要处理。 第二行是N个整数,每个整数处于[0,100]之间。

    2024年02月13日
    浏览(29)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包