关于回溯法符号三角的变形

HelloLina2 2014-05-13 06:11:21
若所求为计算有多少个不同符号三角,使得其所含的“+”比“-”多一或者少一
代码怎么改
已知计算有多少个不同符号三角,使得其所含的“+”比“-”相等的代码
我试着改了一下不对
计算有多少个不同符号三角,使得其所含的“+”比“-”多一或者少一
#include"iostream"
#include<string.h>
using namespace std;
typedef unsigned char uchar;
char cc[2]={'+','-'}; //便于输出
int n, //第一行符号总数
half, //全部符号总数一半
counter; //1计数,即“-”号计数
uchar **p; //符号存储空间
long sum; //符合条件的三角形计数
void Backtrace(int t) //t,第一行第t个符号
{
int i, j;
if( t > n )
{//符号填充完毕
sum++;
//打印符号
cout << "第" << sum << "个:\n";
for(i=1; i<=n; ++i)
{
for(j=1; j<i; ++j)
{
cout << " ";
}
for(j=1; j<=n-i+1; ++j)
{
cout << cc[ p[i][j] ] << " ";
}
cout << "\n";
}
}
else
{
for(i=0; i<2; ++i)
{
p[1][t] = i; //第一行第t个符号
counter += i; //“-”号统计,因为"+"的值是0
for(j=2; j<=t; ++j) //当第一行符号>=2时,可以运算出下面行的某些符号,j可代表行号
{
p[j][t-j+1] = p[j-1][t-j+1]^p[j-1][t-j+2];//通过异或运算下行符号,t-j+1确定的很巧
counter += p[j][t-j+1];
}
if( (counter <= half) && ( t*(t+1)/2 - counter <= half) )
{//若符号统计未超过半数,并且另一种符号也未超过半数,同时隐含两者必须相等才能结束
Backtrace(t+1); //在第一行增加下一个符号
}
//回溯,判断另一种符号情况 像是出栈一样,恢复所有对counter的操作
for(j=2; j<=t; ++j)
{
counter -= p[j][t-j+1];
}
counter -= i;
}
}
}
int main()
{
cout << "请输入第一行符号个数n:";
cin >> n;
counter = 0;
sum = 0;
half = n*(n+1)/2;
int i=0;
if( half%2 == 0 )
{//总数须为偶数,若为奇数则无解
half /= 2;
p = new uchar *[n+1];
for(i=0; i<=n; ++i)
{
p[i] = new uchar[n+1];
memset(p[i], 0, sizeof(uchar)*(n+1));
}
Backtrace(1);
for(i=0; i<=n; ++i) //删除二维动态数组的方法
{
delete[] p[i];
}
delete[] p;
}
cout << "\n总共 " << sum << " 个"<< endl;
return 0;
}
...全文
106 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
HelloLina2 2014-05-14
  • 打赏
  • 举报
回复
自己解决了
HelloLina2 2014-05-13
  • 打赏
  • 举报
回复
是不是没有+比-多的情况存在啊
HelloLina2 2014-05-13
  • 打赏
  • 举报
回复
if( half%2 == 1 ) half=half/2+1; if( (counter <= half) && ( t*(t+1)/2 - counter <= half-1) 我这样修改后输入n的值为7 出现的结果都是“-”的比“+”多一个 不知道对不对

65,208

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧