回溯法求解符号三角形问题
2014-10-07 16:16
316 查看
/************************************************************************/ /* 题目描述:如图是由14个'+'和14个'-'组成的符号三角形。2个同号下面是‘+’,异号是‘-’。 在一般情况下,符号三角形的第一行有n个符号。 要求对于给定的n,计算有多少个不同的符号三角形,使其所含的‘+’和‘-’个数相同。 注意:下面的解法明显不符合总的'+'和'-'号个数的,仅仅满足了2个同号下面是‘+’,异号是‘-’。 写的时候没有细看题目的。 这道题目应该用排列的思想来解,并且在排列过程中来判断是否继续。 */ /************************************************************************/ #include<iostream> #define N 7 // #define n N*(N+1)/2 using namespace std; long count = 0; char a ; char h[2] = {'-', '+'}; //局部性原理 bool Constraint(int t) { int it = t/N, jt = t%N; if (it > 0) { if (a[it-1][jt] == a[it-1][jt+1] && a[it][jt] != '+' ) return false; if (a[it-1][jt] != a[it-1][jt+1] && a[it][jt] != '-' ) return false; } return true; } void Backtrack(int t) { int i = 0; if (t>=n) { /*输出控制: 思想:设置个初值为0的计数器num,当输出了step个之后,计数器归零(为了重新计数),步伐减一,换行继续输出,重新计数。 */ int num = 0; int step = N; //用来控制输出格式 for (i=0; i<n; ++i) { if (num ==step) //已经输出step个了,就换行,重新输出 { --step; num = 0; //重新开始计数 cout << endl; } cout << a[i/N][i%N] <<" " ; ++num; } cout << endl; ++count; } else for (i=0; i<=1; ++i) { a[t/N][t%N] = h[i]; if (Constraint(t)) Backtrack(t+1); } } int main() { Backtrack(0); cout << "the result is " << count<< endl; return 0; }
相关文章推荐
- 第5章 回溯法,符号三角形问题
- 回溯法解符号三角形问题
- 算法java实现--回溯法--符号三角形问题
- 0028算法笔记——【回溯法】批作业调度问题和符号三角形问题
- 0028算法笔记——【回溯法】批作业调度问题和符号三角形问题
- 符号三角形问题(回溯法)
- 小白笔记-----------------------符号三角形问题(回溯法---子集树)
- [编程之美]回溯法求解数组分割问题
- CodeDom系列二---程序基本结构--符号三角形问题
- CodeDom系列二---程序基本结构--符号三角形问题
- 0-1背包问题简单实例(回溯法求解…
- 用回溯法求解0—1背包问题,并输出问题的最优解
- 符号三角形问题 回溯法
- 回溯法求解m着色问题
- 回溯法解决N皇后问题——递归与非递归求解
- 符号三角形问题-回溯法
- 用回溯法求解八皇后问题
- 递归-回溯法求解8皇后问题(C)
- 符号三角形问题
- 数据结构与算法中的“递归”——用回溯法求解8皇后问题