打印符号三角形问题java_回溯法之符号三角形问题
问题描述:
由14个“+”号和14个“-”号组成的符号三角形。
2个同号下面是“+”号,2个异号下面是“-”号。
如图:
+ + _ + _ + +
+ _ _ _ _ +
_ + + + _
_ + + _
_ + _
_ _
+
在一般情况下,符号三角形第一行有N个符号,该问题要求对于给定n计算有多少种不同的符号三角形。使其所含的+ — 个数相同。
算法设计:
1 x[i] =1 时,符号三角形的第一行的第i个符号为+
2 x[i] =0时,表示符号三角形的第一行的第i个符号位-
共有i(i+1)/2个符号组成的符号三角形。
3 确定x[i+1]的值后,只要在前面确定的符号三角形的右边加一条边就扩展为x[1:i+1]所相应的符号三角形。
4 最后三角形中包含的“+”“-”的个数都为i(i+1)/4,因此搜索时,个数不能超过i(i+1)/4,若超直接可以剪去分枝。
5 当给定的n(n+1)/2为奇数时,也不符合三角形要求。
算法实现:
#include #include
#define MAX 100
//global variables
int count=0;//the number of '-'
int sum=0;//the number of the result
int p[MAX][MAX]={0}; //1 is '-' 0 is '+'
int n=0;int half=0;//half=n*(n+1)/4
void back_triangle(intt);intmain()
{
printf("Please input n:");
scanf("%d",&n);
half=n*(n+1)/2;if(half%2!=0)
{
printf("The number that you input is not meaningful for this problem!");
getch();return 1;
}
half/=2;
back_triangle(1);
printf("The result is %d",sum);
getch();return 0;
}void back_triangle(intt)
{if(count>half || t*(t-1)/2-count>half)//because of this,the "count==half" is not necessary
return;if(t>n) //the count==half is not necessary
{
sum++;for(int temp=1;temp<=n;temp++)
{for(int tp=1;tp<=n;tp++)
{
printf("%d",p[temp][tp]);
}
printf("\n");
}
printf("\n");
}else{inti;for(i=0;i<2;i++)
{
p[1][t]=i;
count+=i;intj;for(j=2;j<=t;j++)
{
p[j][t-j+1]=(p[j-1][t-j+1]^p[j-1][t-j+2]);
count+=p[j][t-j+1];
}
back_triangle(t+1);for(j=2;j<=t;j++)
count-=p[j][t-j+1];
count-=i;
}
}
}
View Code
运行结果:
下面是n*(n+1)/2为奇数时的结果;
算法效率分析
计算可行性约束需要O(n)时间,在最坏情况下有O(2^n)个结点需要计算可行性约束,故总计算时间为O(n*2^n)
参考:王晓东《算法设计分析》
打印符号三角形问题java_回溯法之符号三角形问题相关推荐
- 编程解决素数环问题Java_回溯法解决素数环问题java实现
素数环问题: 输入正整数n,把整数1,2,3--,n组成一个环,使得相邻两个整数之和均为素数,输出所有方案,注意同一个环应恰好输出一次.n<==16 样例输入: 6 样例输出: 1 4 3 2 ...
- Python回溯法解符号三角形问题
以0表示加号,1表示减号 #! /usr/bin/env python #coding=utf-8 #! /usr/bin/env python #coding=utf-8 from __future ...
- 符号三角形问题(回溯)
[cpp] view plaincopy /*回溯法解符号三角形问题 问题描述: 如下图是由14个"+"和14个"-"组成的符号三角形, 2个同号下面都是&qu ...
- java 符号三角形_算法java实现--回溯法--符号三角形问题
符号三角形问题的java实现(回溯法) 具体问题描述以及C/C++实现参见网址 http://blog.csdn.net/liufeng_king/article/details/8764319 /* ...
- 符号三角形 回溯法 pta
符号三角形的 第1行有n个由"+"和"-"组成的符号 ,以后每行符号比上行少1个,2个同号下面是"+",2个异 号下面是"-&qu ...
- 回溯法——打印子集树
打印子集树.比如说有三个元素,用0和1表示子集有或者没有这个元素,向左分支走为1,向右分支走为0,那么如下图所有路径都可以用0和1表示出来,可以用0和1完整表示子集.0就不打印对应的元素,1就打印对应 ...
- C++编程 打印三角形的各种玩法
目录 1. 指定五行直角三角形 2. 由用户指定任意行的等腰三角形 3.平行四边形式等腰三角形拆分 4.菱形 1. 指定五行直角三角形 解题思想: 解决该题的主要难点在于每行的固定输出,那么如何让每 ...
- Java-数字三角形(回溯法)
Java-数字三角形(回溯法) 题目描述: 上图给出了一个数字三角形.从三角形的顶部到底部有很多条不同的路径.对于每条路径,把路径上面的数加起来可以得到一个和,你的任务就是找到最大的和. 路径上的每一 ...
- P1118 [USACO06FEB]数字三角形`Backward Digit Su`… 回溯法
有这么一个游戏: 写出一个11至NN的排列a_iai,然后每次将相邻两个数相加,构成新的序列,再对新序列进行这样的操作,显然每次构成的序列都比上一次的序列长度少11,直到只剩下一个数字位置.下面是一 ...
最新文章
- 用ASP.NET如何读取NT用户名
- GPU 「抗压」不行还费电,FPGA将成深度学习「新基建」
- THINKPHP_关联模型_HAS_ONE/HAS/MANY/BELONGS_TO
- Leetcode | Sort List
- 【干货】浅谈分布式数据库中间件之分库分表
- Windows上的音频采集技术
- 直播预告 | 从编码器与解码器端改进生成式句子摘要
- 最全三大框架整合(使用映射)——DeptServiceImpl.java
- jquery笔记一:下载安装、语法、选择器、遍历选择元素的方法、jQuery动画
- php 5.6 文档,文件存储 | 进阶系列 | Laravel 5.6 中文文档
- iphone 通过获取IMSI判断运营商
- js接收php 回调,JS callback回调函数的使用(附代码)
- 神经网络的 Delta 学习规则(learning rule)
- 在Adobe Html5 Extension的使用Nodejs的问题
- 如何进行软件需求分析
- 教你如何搜索公众号中的文章
- vs2008 SP1 安装问题小解决方案
- html 倒计时,jQuery倒计时插件
- #93 输出N以内的所有素数
- 探索Franka Emika 机器人丨Powertool和Franka world的作用
热门文章
- 谷歌网盘云盘google drive扩容方法
- html字体打印效果,基于jQuery实现文字打印动态效果
- Java-Collection集合之单列集合List,以及遍历方式
- 什么是RS-485?
- 处理文件上传后返回json数据在IE出现文件下载问题(框架是spring boot)
- (最新)天津各片区,各小区,各学校 对应关系,持续更新
- 污水处理成本高怎么办?智能网关+云平台提供你完美解决方案
- 忧伤的步调,伤感的歌曲,爱情路只是我一个人de仰望
- 计算机任务驱动法教学应用,_任务驱动法_在计算机基础教学中的应用
- kingroot权限管理_KingRoot授权管理