幸运三角形

时间限制:1000 ms  |  内存限制:65535 KB
难度:3

描述

话说有这么一个图形,只有两种符号组成(‘+’或者‘-’),图形的最上层有n个符号,往下个数依次减一,形成倒置的金字塔形状,除第一层外(第一层为所有可能情况),每层形状都由上层决定,相邻的符号相同,则下层的符号为‘+’,反之,为‘-’;如下图所示(n = 3 时的两种情况):

如果图中的两种符号个数相同,那这个三角形就是幸运三角形,如上图中的图(2).

输入
有多组测试数据(少于20组)。
每行含一个整数n(0<n<20)。
输出
输出相应的幸运三角形个数。
样例输入
3
4
样例输出
4
6

代码一:  TLE 

 1 #include <cstdio>
 2 #include <iostream>
 3
 4 using namespace std;
 5 int a[25];
 6 int n, cnt;
 7
 8 bool judge()
 9 {
10     int t0, t1;
11     t0 = t1 = 0;
12     for(int end = n; end >= 1; --end)
13     {
14         for(int i = 1; i <= end; ++i)
15         {
16             if(a[i] == 1)
17                 ++t1;
18             else
19                 ++t0;
20             if(t1 > ((n+1)*n>>1) || t1 > ((n+1)*n>>1))  //剪枝
21                 return false;
22             if(i > 1)
23             {
24                 if(a[i] == a[i-1])
25                     a[i-1] = 1;
26                 else
27                     a[i-1] = 0;
28             }
29         }
30     }
31     if(t0 == t1)
32         return true;
33     return false;
34 }
35
36 void DFS(int cur)
37 {
38     if(cur > n)
39     {
40         if(judge())
41             ++cnt;
42         return;
43     }
44     a[cur] = 1;
45     DFS(cur+1);
46     a[cur] = 0;
47     DFS(cur+1);
48 }
49
50 int main()
51 {
52     while(scanf("%d", &n))
53     {
54         if(((n+1)*n>>1) & 1)
55         {
56             printf("0\n");
57             continue;
58         }
59         cnt = 0;
60         DFS(1);
61         printf("%d\n", cnt);
62     }
63     return 0;
64 }

View Code

代码二:打表-----AC 

 1 #include <cstdio>
 2 #include <iostream>
 3
 4 using namespace std;
 5
 6 int main()
 7 {
 8     int ans[21] = {0,0,0,4,6,0,0,12,40,0,0,171,410,0,0,1896,5160,0,0,32757,59984};
 9     int n;
10     while(~scanf("%d", &n))
11     {
12         printf("%d\n", ans[n]);
13     }
14     return 0;
15 } 

View Code

代码三:----copy最优代码(边计算边回溯,避免了重复计算,很给力啊)

 1 #include"iostream"
 2 #include<cstring>
 3 #include<stdio.h>
 4 #include<time.h>
 5 using namespace std;
 6 typedef unsigned char uchar;
 7
 8 //char cc[2]={'+','-'};    //便于输出
 9 int n,                     //第一行符号总数
10     half,                 //全部符号总数一半
11     counter;             //1计数,即  '-' 号计数
12
13 char **p;                //符号存储空间
14 long sum;                //符合条件的三角形计数
15
16 //t,第一行第 t个符号
17 void Backtrace(int t)
18 {
19     int i, j;
20
21     if( t > n )
22         sum++;
23     else
24     {
25        for(i=0; i<2; ++i)  //只取  0('+')  或者  1('-')
26        {
27             p[1][t] = i;   //第一行第 t个符号
28             counter += i;        //'-'号统计
29             for(j=2; j<=t; ++j)    //当第一行符号 >=2时,可以运算出下面行的某些符号(第一行有几个数就可以相应往下计算几行,每次计算过的就不用重复计算)
30             {
31                 p[j][t-j+1] = p[j-1][t-j+1]^p[j-1][t-j+2];//通过异或运算下行符号
32                 counter += p[j][t-j+1];
33             }
34             if( (counter <= half) && ( t*(t+1)/2 - counter <= half) )//若符号统计未超过半数,并且另一种符号也未超过半数
35                 Backtrace(t+1);            //在第一行增加下一个符号
36             //回溯,判断另一种符号情况
37             for(j=2; j<=t; ++j)
38                 counter -= p[j][t-j+1];
39             counter -= i;
40        }
41     }
42 }
43
44 int main()
45 {
46     while(scanf("%d", &n) != EOF)
47     {
48         counter = 0;
49         sum = 0;
50         half = n*(n+1)/2;
51
52         if( half%2 == 0 )//总数须为偶数,若为奇数则无解
53         {
54             half /= 2;
55             p = new char *[n+1];
56             for(int i=0; i<=n; ++i)
57             {
58                p[i] = new char[n+1];
59                memset(p[i], 0, sizeof(char)*(n+1));
60             }
61             Backtrace(1);
62         }
63         printf("%d\n", sum);
64     }
65     return 0;
66 }         

View Code

NYOJ-491 幸运三角形相关推荐

  1. 幸运三角形 南阳acm491(dfs)

    幸运三角形 时间限制:1000 ms  |  内存限制:65535 KB 难度:3 描述 话说有这么一个图形,只有两种符号组成('+'或者'-'),图形的最上层有n个符号,往下个数依次减一,形成倒置的 ...

  2. NYOJ 659 判断三角形

    判断三角形 时间限制:1000 ms  |  内存限制:65535 KB 难度:2 描述 小明非常喜欢研究三角形.现在,小明已经知道三角形的三条边,如果三条边能组成三角形,小明就会很高兴,他就会得到一 ...

  3. Learn OpenGL (二):三角形

    知识补充: 顶点数组对象:Vertex Array Object,VAO 顶点缓冲对象:Vertex Buffer Object,VBO 索引缓冲对象:Element Buffer Object,EB ...

  4. 判定一个点是否在三角形内

    三角形的面积公式如下: 在此处使用一种常见且简便的方法:如果三角形PAB,PAC和PBC的面积之和与三角形ABC的面积相等,即可判定点P在三角形ABC内(包括在三条边上). 可知,该方法的关键在于如何 ...

  5. css 绘制三角形_解释CSS形状:如何使用纯CSS绘制圆,三角形等

    css 绘制三角形 Before we start. If you want more free content but in video format. Don't miss out on my Y ...

  6. 【Modern OpenGL】第一个三角形

    >说明:跟着learnopengl的内容学习,不是纯翻译,只是自己整理记录.>强烈推荐原文,无论是内容还是排版. [原文链接](http://learnopengl.com/#!Getti ...

  7. spark的数三角形算法_数据算法 Hadoop Spark大数据处理技巧 PDF 下载

    相关截图: 资料简介: 本书介绍了很多基本设计模式.优化技术和数据挖掘及机器学习解决方案,以解决生物信息学.基因组学.统计和社交网络分析等领域的很多问题.这本书还概要介绍了MapReduce.Hado ...

  8. 【Vulkan学习记录-基础篇-1】用Vulkan画一个三角形

    好久没有更新过博客了,上半年一直忙着找实习的事情,不过现在已经入职一段时间了,也可以抽出时间来继续整理一些内容,所以最近会尽量变得勤快一点来写博客. Vulkan是新一代的图形API,具有跨平台.高性 ...

  9. OPenGL 学习笔记之 VAO VBO EBO 以及SHADER 并使用其绘制三角形

    译注 在学习此节之前,建议将这三个单词先记下来: 顶点数组对象:Vertex Array Object,VAO 顶点缓冲对象:Vertex Buffer Object,VBO 索引缓冲对象:Eleme ...

最新文章

  1. WPF TreeView HierarchicalDataTemplate
  2. 【Python】Python一行代码能做什么,30个实用案例代码详解
  3. LeetCode 电子书!
  4. SpringBoot 中常用注解@PathVaribale/@RequestParam/@GetMapping介绍
  5. ASCII码表在线查询进制转换
  6. esp32 怎么分配freertos 堆栈大小_嵌入式开发入门-从STM32CudeMX、FreeRtos、Proteu仿真开始...
  7. loopback接口、router ID详解
  8. css3弹性盒子+小程序布局
  9. 极简Markdown程序员简历模板
  10. php laravel手册,laravel5.6手册下载|Laravel5.6中文手册pdf最新版下载(附使用方法)_星星软件园...
  11. 电力电子技术各类整流电路Matlab_simulink仿真分析
  12. 反汇编基础:winRar去除广告
  13. matlab谐振峰值,谐振峰值Mr怎么求?
  14. 使用python编写一个爬虫程序
  15. KEBA机器人控制器简介
  16. Serverless新手部署入门
  17. Proteus ISIS入门
  18. THU-OS rCore学习总结 基于Rust + RISC-V
  19. 网站建设后的seo优化工作将如何展开?
  20. 倪震华教授版《振动力学》学习(三)

热门文章

  1. 从企业发展的角度来分析做网站的重要性
  2. EasyTrader踩坑之旅总结
  3. petshop4.0 详解之三(PetShop数据访问层之消息处理)
  4. 4.9 利用对应的泛型替换Hashtable[转]
  5. php将json格式的数据直接存入mysql数据库
  6. 搞定网页打印自动分页问题
  7. 网站是如何跟踪监视你的
  8. JavaScript 图片的上传前预览
  9. set_error_handler() 重要用法
  10. 机器学习模型的可解释性