C++搜索与回溯算法之符号三角形
来源:互联网 发布:精灵香水淘宝店铺证吗 编辑:程序博客网 时间:2024/06/17 21:27
符号三角形
Description
符号三角形的第1行有n个由“+”和”-“组成的符号 ,以后每行符号比上行少1个,2个同号下面是”+“,2个异号下面是”-“ 。计算有多少个不同的符号三角形,使其所含”+“ 和”-“ 的个数相同。
n=7时的1个符号三角形如下:
+ + - + - + ++ - - - - +- + + + -- + + -- + -- -+
Input
每行1个正整数n<=24,n=0退出.
Output
n和符号三角形的个数.
Sample Input
151619200
Sample Output
15 189616 516019 3275720 59984
思路
这道题应该用深搜去构造顶层,然后推算出其他的层,在推算的同时进行给其中一种符号的计数,最后判断该符号的数是不是总符号数的一半,剩下的一些细节(诸如符号总数是否可以整除2、如何在输入0时结束程序等)我就不解释了,不过代码里的注释中会有。
解题
#include<iostream>using namespace std;int n,total,sum;int word[30][30]; //存储符号的数组 void wxy() //函数名没有含义{ int x=n,y=0; //x用于枚举层数,y用于计算其它层负号个数 while(x--) //枚举层数 for(int i=1;i<=x;i++) { word[x][i]=(word[x+1][i]+word[x+1][i+1])%2; //定义第n-x+1层的第i个符号 if(word[x][i]) y++; //若word[x][i]为负号,其它层负号个数加1 } if(sum+y==n*(n+1)/2/2) total++; //若负号的个数为符号总数的一半,情况数加1(运用了等差数列)}void dfs(int x){ for(int i=0;i<2;i++) //0为正号,1为负号 { if(i) sum++; //给题目中顶层的负号计数 word[n][x]=i; //定义顶层的第x个符号是正还是负 if(x==n) wxy(); //若顶层的所有符号定义完毕,计算其它层的负号个数 else dfs(x+1); //定义顶层的第x+1个符号 if(i) sum--; //回溯 }}main(){ while(cin>>n&&n) //输入n,判断n为不为0 { cout<<n<<" "; if((n*(n+1)/2)%2) {cout<<"0"<<endl;continue;} //判断符号总数是否可以整除2,(n*(n+1)/2是运用等差数列来算总数的) dfs(1); cout<<total<<endl; total=sum=0; }}
阅读全文
0 1
- C++搜索与回溯算法之符号三角形
- 算法分析与设计回溯法之符号三角形
- 回溯之符号三角形问题
- 符号三角形问题(回溯)-算法设计与分析
- 回溯法之符号三角形测试代码
- 回溯法-符号三角形
- 符号三角形 回溯法
- 符号三角形的回溯算法(王晓东算法分析例题)
- C++搜索与回溯算法之红与黑
- 算法java实现--回溯法--符号三角形问题
- 算法设计_回溯法_符号三角形问题
- 搜索算法之回溯讲解
- C++搜索与回溯算法之全排列问题
- C++搜索与回溯算法之素数环问题
- C++搜索与回溯算法之迷宫问题
- C++搜索与回溯算法之移动问题
- C++搜索与回溯算法之八皇后问题
- C++搜索与回溯算法之拆数
- 信息论笔记
- PAT A1046. Shortest Distance
- 小白带你学安卓——初识android
- xaml的一些奇奇怪怪的错误
- ListView的每个item都像卡片一样摆在界面上,另外每个item下方有3d阴影效果
- C++搜索与回溯算法之符号三角形
- BZOJ 3175 [Tjoi2013]攻击装置 二分图极大点独立集
- python小程序-0012
- Node.js & Electron的扩展模块
- C++快排调用
- #bzoj2803#普通平衡树(Avl平衡树 or Splay)
- "a|b|c|".split("|")的返回数组问题
- 综合业务数字网ISDN
- node开发之mongoose连接错误