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

如果图中的两种符号个数相同,那这个三角形就是幸运三角形,如上图中的图(2).
- 输入
- 有多组测试数据(少于20组)。
 每行含一个整数n(0<n<20)。
- 输出
- 输出相应的幸运三角形个数。
- 样例输入
- 
3 
 4
- 样例输出
- 
4 
 6///排列组合第一行,然后直接寻找是否相等 
 #include <iostream>
 #include <cstdio>
 #include <cstring>
 #define N 1010
 #define MOD 1000000007
 using namespace std;
 int n,m,ans[];
 int a[];///待排列的数存储在此
 bool vis[];
 int p[N][N],k;
 int sum,num,tot;
 void dfs(int cnt)///按字典序输出n个数选m个数的所有排列
 {
 if(cnt==m)
 {
 for(int i=; i<m; i++)
 {
 if(ans[i] == ans[i+] && i+ < m)
 p[][k] = ,sum++;
 else
 p[][k] = ;
 k++;
 if(ans[i] == )
 sum++;
 }
 int c = ;
 while(c < m)
 {
 k = ;
 for(int i = ; i < m - c + ; i++)
 {
 if(p[c-][i] == p[c-][i+] && i+ < m - c + )
 p[c][k] = ,sum++;
 else
 p[c][k] = ;
 k++;
 }
 c++;
 }
 if(sum == num)
 tot++;
 k = ;
 // for(int i=0; i<m; i++)
 // cout<<ans[i]<<"***";
 // cout<<endl;
 // for(int i = 1; i < m; i++)
 // {
 // for(int j = 0 ; j < m-i; j++)
 // cout<<p[i][j]<<"***";
 // cout<<endl;
 // }
 // cout<<sum<<" "<<num<<endl;
 sum = ;
 return ;
 }
 for(int i=; i<n; i++)
 {
 ans[cnt]=a[i];
 dfs(cnt+);
 }
 }
 int main()
 {
 while(cin>>m)
 {
 k = ;
 n = ;
 sum = ;
 tot = ;
 num = m * (m + );
 if(num % )
 {
 cout<<<<endl;
 continue;
 }
 else
 num /= ;
 fill(vis,vis+,);
 a[] = ;
 a[] = ;
 dfs();
 cout<<tot<<endl;
 }
 return ;
 }TLE 纯粹dfs,回溯还未入门,不过如果应试的话完全可以打表,毕竟数据量不是太大。 ///排列组合第一行,然后直接寻找是否相等 
 #include <iostream>
 #include <cstdio>
 #include <cstring>
 #define N 1010
 #define MOD 1000000007
 using namespace std;
 int n,m,ans[];
 int a[];///待排列的数存储在此
 bool vis[];
 int p[N][N],k;
 int sum,num,tot;
 void dfs(int cnt)///按字典序输出n个数选m个数的所有排列
 {
 if(cnt==m)
 {
 for(int i=; i<m; i++)
 {
 if(ans[i] == ans[i+] && i+ < m)
 p[][k] = ,sum++;
 else
 p[][k] = ;
 k++;
 if(ans[i] == )
 sum++;
 }
 int c = ;
 while(c < m)
 {
 k = ;
 for(int i = ; i < m - c + ; i++)
 {
 if(p[c-][i] == p[c-][i+] && i+ < m - c + )
 p[c][k] = ,sum++;
 else
 p[c][k] = ;
 k++;
 }
 c++;
 }
 if(sum == num)
 tot++;
 k = ;
 // for(int i=0; i<m; i++)
 // cout<<ans[i]<<"***";
 // cout<<endl;
 // for(int i = 1; i < m; i++)
 // {
 // for(int j = 0 ; j < m-i; j++)
 // cout<<p[i][j]<<"***";
 // cout<<endl;
 // }
 // cout<<sum<<" "<<num<<endl;
 sum = ;
 return ;
 }
 for(int i=; i<n; i++)
 {
 ans[cnt]=a[i];
 dfs(cnt+);
 }
 }
 int main()
 {
 for(m = ; m < ; m++)
 //while(cin>>m)
 {
 k = ;
 n = ;
 sum = ;
 tot = ;
 num = m * (m + );
 if(num % )
 {
 cout<<<<",";
 continue;
 }
 else
 num /= ;
 fill(vis,vis+,);
 a[] = ;
 a[] = ;
 dfs();
 cout<<tot<<",";
 }
 return ;
 }打表过了 回溯才是正解,可以减掉重复计算的值,但是自己没搞懂,留下正解先 ///边回溯边计算,避免重复计算 
 #include"iostream"
 #include<cstring>
 #include<stdio.h>
 #include<time.h>
 using namespace std;
 typedef unsigned char uchar; //char cc[2]={'+','-'}; //便于输出
 int n, //第一行符号总数
 half, //全部符号总数一半
 counter; //1计数,即 '-' 号计数 char **p; //符号存储空间
 long sum; //符合条件的三角形计数 //t,第一行第 t个符号
 void Backtrace(int t)
 {
 int i, j; if( t > n )
 sum++;
 else
 {
 for(i=; i<; ++i) //只取 0('+') 或者 1('-')
 {
 p[][t] = i; //第一行第 t个符号
 counter += i; //'-'号统计
 for(j=; j<=t; ++j) //当第一行符号 >=2时,可以运算出下面行的某些符号(第一行有几个数就可以相应往下计算几行,每次计算过的就不用重复计算)
 {
 p[j][t-j+] = p[j-][t-j+]^p[j-][t-j+];//通过异或运算下行符号
 counter += p[j][t-j+];
 }
 if( (counter <= half) && ( t*(t+)/ - counter <= half) )//若符号统计未超过半数,并且另一种符号也未超过半数
 Backtrace(t+); //在第一行增加下一个符号
 //回溯,判断另一种符号情况
 for(j=; j<=t; ++j)
 counter -= p[j][t-j+];
 counter -= i;
 }
 }
 } int main()
 {
 while(scanf("%d", &n) != EOF)
 {
 counter = ;
 sum = ;
 half = n*(n+)/; if( half% == )//总数须为偶数,若为奇数则无解
 {
 half /= ;
 p = new char *[n+];
 for(int i=; i<=n; ++i)
 {
 p[i] = new char[n+];
 memset(p[i], , sizeof(char)*(n+));
 }
 Backtrace();
 }
 printf("%d\n", sum);
 }
 return ;
 }回溯正解 http://www.cnblogs.com/dongsheng/archive/2013/06/16/3138607.html 
NYOJY 491 幸运三角形的更多相关文章
- NYOJ 491 幸运三角形
		幸运三角形 import java.util.Scanner; public class Main{//搜索 static int sum=0,n; public static void main(S ... 
- nyoj 幸运三角形
		幸运三角形 时间限制:1000 ms | 内存限制:65535 KB 难度:3 描述 话说有这么一个图形,只有两种符号组成(‘+’或者‘-’),图形的最上层有n个符号,往下个数依次减一,形成倒 ... 
- 幸运三角形 南阳acm491(dfs)
		幸运三角形 时间限制:1000 ms | 内存限制:65535 KB 难度:3 描述 话说有这么一个图形,只有两种符号组成(‘+’或者‘-’),图形的最上层有n个符号,往下个数依次减一,形成倒 ... 
- NYOJ--491--dfs(打表水过)--幸运三角形
		/* Name: NYOJ--491--幸运三角形 Author: shen_渊 Date: 15/04/17 16:26 Description: DFS超时,深搜出第一行的所有情况,计算之后打表水 ... 
- nyoj--491--幸运三角形(dfs)
		幸运三角形 时间限制:1000 ms | 内存限制:65535 KB 难度:3 描述 话说有这么一个图形,只有两种符号组成('+'或者'-'),图形的最上层有n个符号,往下个数依次减一,形成倒置的 ... 
- 用CSS绘制箭头等三角形图案 [译]
		最近重新设计了我的网站,准备添加tooltips提示信息效果.实现很容易,但我想要让提示功能具有三角形的指示图标.当我重新思考想要所设计的每个图标颜色都随心所欲的时候,采用图片那就是一场灾难.幸运的是 ... 
- LearnOpenGL 你好,三角形[转]--附源码
		原地址:你好,三角形 你好,三角形 原文 Hello Triangle 作者 JoeyDeVries 翻译 Django 校对 Geequlim 译注 在学习此节之前,建议将这三个单词先记下来: 顶点 ... 
- OpenGL学习笔记(二)画三角形
		目录 渲染管线(Graphics Pipeline) 编码实现 顶点数据 顶点缓冲对象(VBO) 顶点着色器 编译着色器 片段着色器 着色器程序 链接顶点属性 顶点数组对象 最终绘制三角形 索引缓冲对 ... 
- canvas快速绘制圆形、三角形、矩形、多边形
		想看前面整理的canvas常用API的同学可以点下面: canvas学习之API整理笔记(一) canvas学习之API整理笔记(二) 本系列文章涉及的所有代码都将上传至:项目代码github地址,喜 ... 
随机推荐
- 点击空白处div消失的方法
			这是做的js页面的一部分,也是上一篇文章中加载json格式数据后展示的效果界面. 现在的问题是:点击南京市后会弹出下面的白色的框,点击框右上角的X号后会关闭白色的框,现在想点击白色的框周围的任一地方, ... 
- Java8新特性——接口的默认方法和类方法
			Java8新增了接口的默认方法和类方法: 以前,接口里的方法要求全部是抽象方法,java8以后允许在接口里定义默认方法和类方法: 不同的是: 默认方法可以通过实现接口的类实例化的对象来调用,而类方法只 ... 
- occ代码分析
			临时变量就是local里面的变量擦除变量就是把模型改成擦除标记 void SelectMgr_SelectionManager::LoadMode (const Handle(SelectMgr_Se ... 
- ArcGIS Add-in插件开发从0到1及实际案例分享
			同学做毕设,要求我帮着写个ArcGIS插件,实现功能为:遍历所有图斑,提取相邻图斑的公共边长及其他属性(包括相邻图斑的ID),链接到属性表中.搞定后在这里做个记录.本文分两大部分: ArcGIS插件开 ... 
- Sql Server Alter语句
			1:向表中添加字段 Alter table [表名] add [列名] 类型 2: 删除字段 Alter table [表名] drop column [列名] 3: 修改表中字段类型 (可以修 ... 
- Bootstrap 表单
			表单布局 Bootstrap 提供了下列类型的表单布局: 垂直表单(默认) 内联表单 水平表单 垂直或基本表单 基本的表单结构是 Bootstrap 自带的,个别的表单控件自动接收一些全局样式.下面列 ... 
- redis命令全集(自用)
			1.连接操作相关的命令 quit:关闭连接(connection) auth:简单密码认证 2.对value操作的命令 exists(key):确认一个key是否存在 del(key):删除一个key ... 
- 从HTML到HTML
			从HTML到HTML 当你在使用一些模板软件,如Thymeleaf的时候,了解web的标准,HTML家族的内部是十分重要的,至少如果你想知道自己在做什么的时候. 问题是,每个人都知道他们正在使用一些技 ... 
- Jquery做全选
			<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ... 
- linux 网卡问题  Device eth0 does not seem to be present,delaying initialization.
			Device eth0 does not seem to be present,delaying initialization. 网上搜索后才发现原因所在:原来vmware在复制了虚拟机后会自动生成一 ... 
