问题描述:

由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_回溯法之符号三角形问题相关推荐

  1. 编程解决素数环问题Java_回溯法解决素数环问题java实现

    素数环问题: 输入正整数n,把整数1,2,3--,n组成一个环,使得相邻两个整数之和均为素数,输出所有方案,注意同一个环应恰好输出一次.n<==16 样例输入: 6 样例输出: 1 4 3 2  ...

  2. Python回溯法解符号三角形问题

    以0表示加号,1表示减号 #! /usr/bin/env python #coding=utf-8 #! /usr/bin/env python #coding=utf-8 from __future ...

  3. 符号三角形问题(回溯)

    [cpp] view plaincopy /*回溯法解符号三角形问题 问题描述: 如下图是由14个"+"和14个"-"组成的符号三角形, 2个同号下面都是&qu ...

  4. java 符号三角形_算法java实现--回溯法--符号三角形问题

    符号三角形问题的java实现(回溯法) 具体问题描述以及C/C++实现参见网址 http://blog.csdn.net/liufeng_king/article/details/8764319 /* ...

  5. 符号三角形 回溯法 pta

    符号三角形的 第1行有n个由"+"和"-"组成的符号 ,以后每行符号比上行少1个,2个同号下面是"+",2个异 号下面是"-&qu ...

  6. 回溯法——打印子集树

    打印子集树.比如说有三个元素,用0和1表示子集有或者没有这个元素,向左分支走为1,向右分支走为0,那么如下图所有路径都可以用0和1表示出来,可以用0和1完整表示子集.0就不打印对应的元素,1就打印对应 ...

  7. C++编程 打印三角形的各种玩法

    目录 1. 指定五行直角三角形 2. 由用户指定任意行的等腰三角形 3.平行四边形式等腰三角形拆分 4.菱形 1. 指定五行直角三角形 解题思想:  解决该题的主要难点在于每行的固定输出,那么如何让每 ...

  8. Java-数字三角形(回溯法)

    Java-数字三角形(回溯法) 题目描述: 上图给出了一个数字三角形.从三角形的顶部到底部有很多条不同的路径.对于每条路径,把路径上面的数加起来可以得到一个和,你的任务就是找到最大的和. 路径上的每一 ...

  9. P1118 [USACO06FEB]数字三角形`Backward Digit Su`… 回溯法

    有这么一个游戏: 写出一个11至NN的排列a_iai​,然后每次将相邻两个数相加,构成新的序列,再对新序列进行这样的操作,显然每次构成的序列都比上一次的序列长度少11,直到只剩下一个数字位置.下面是一 ...

最新文章

  1. 用ASP.NET如何读取NT用户名
  2. GPU 「抗压」不行还费电,FPGA将成深度学习「新基建」
  3. THINKPHP_关联模型_HAS_ONE/HAS/MANY/BELONGS_TO
  4. Leetcode | Sort List
  5. 【干货】浅谈分布式数据库中间件之分库分表
  6. Windows上的音频采集技术
  7. 直播预告 | 从编码器与解码器端改进生成式句子摘要
  8. 最全三大框架整合(使用映射)——DeptServiceImpl.java
  9. jquery笔记一:下载安装、语法、选择器、遍历选择元素的方法、jQuery动画
  10. php 5.6 文档,文件存储 | 进阶系列 | Laravel 5.6 中文文档
  11. iphone 通过获取IMSI判断运营商
  12. js接收php 回调,JS callback回调函数的使用(附代码)
  13. 神经网络的 Delta 学习规则(learning rule)
  14. 在Adobe Html5 Extension的使用Nodejs的问题
  15. 如何进行软件需求分析
  16. 教你如何搜索公众号中的文章
  17. vs2008 SP1 安装问题小解决方案
  18. html 倒计时,jQuery倒计时插件
  19. #93 输出N以内的所有素数
  20. 探索Franka Emika 机器人丨Powertool和Franka world的作用

热门文章

  1. 谷歌网盘云盘google drive扩容方法
  2. html字体打印效果,基于jQuery实现文字打印动态效果
  3. Java-Collection集合之单列集合List,以及遍历方式
  4. 什么是RS-485?
  5. 处理文件上传后返回json数据在IE出现文件下载问题(框架是spring boot)
  6. (最新)天津各片区,各小区,各学校 对应关系,持续更新
  7. 污水处理成本高怎么办?智能网关+云平台提供你完美解决方案
  8. 忧伤的步调,伤感的歌曲,爱情路只是我一个人de仰望
  9. 计算机任务驱动法教学应用,_任务驱动法_在计算机基础教学中的应用
  10. kingroot权限管理_KingRoot授权管理