符号三角形问题
2015-10-16 17:43
295 查看
#include "stdio.h" #include "stdlib.h" #include "string.h" #define MAX 10 int n; //三角形第一行的符号个数 int count = 0; //加号个数 int half; //n*(n+1/4 应有的+、-号个数 int sum = 0; //满足+号等于-号的三角形个数 int p[MAX][MAX]; //存储三角形符号 //i表示搜索到第i层 void backtrack(int i) { if(count>half || (i*(i-1)/2-count)>half) //剪枝,如果+号或-号个数超过符号总数的一半 return; if(i>n) //搜索到叶子结点 sum++; else { int j; for(j=0; j<2; j++) { p[1][i] = j; //第i层,三角形第一行的第i个符号,0表示-,1表示+ count += p[1][i]; //+号个数 int t; for(t=2; t<=i; t++) //从三角形的第2到第i行 { /*确定第1行第i个元素后,再依次考虑新加入的斜边所对应的各行(2到i) 中相应元素的具体值,并累加+号数目 */ p[t][i-t+1] = p[t-1][i-t+1]^p[t-1][i-t+2]; count+=p[t][i-t+1]; } backtrack(i+1); //搜索下一层 for(t=2; t<=i; t++) //为返回上一层作准备 { count-=p[t][i-t+1]; } count -= p[1][i]; } } } //计算+号等于-号的三角形个数 void compute() { half = n*(n+1)/2; if(half % 2 ==1) //如果总数为奇数,不满足 sum = 0; else { half /= 2; memset(p, 0, sizeof(p)); //将三角形符号数组初始化为0 backtrack(1); } } int main() { printf("输入三角形第一行符号个数:"); scanf("%d", &n); compute(); printf("+号等于-号的三角形个数为:%d\n", sum); return 0; }
相关文章推荐
- 关于nio 中的那些事
- Spark:一个高效的分布式计算系统
- js转义字符串
- 高性能、高并发TCP服务器(多线程调用libevent)
- php开发中的10大良好习惯
- Mariadb安装部署
- ios 9.0以上本版 问题总结
- [LeetCode]Happy Number
- Android SeekBar 和 draw9patch 的使用
- Xcode官方下载地址
- 将html中的代码拷贝到jsp后出现的问题 Failed to create the part's controls
- Linux信号实践(4) --可靠信号
- 获取登录需要的cookie简单案列
- 20151015查找素数
- iOS保存图片到相册
- iOS开发多线程篇—GCD的常见用法
- Cleaver快速制作网页PPT
- LINQ取复杂列表
- ActiveAdmin扩展:CSV数据导入
- Linux信号实践(3) --信号内核表示