搜索---幸运三角形

//一、

#include<iostream>

#include<cstring>

using namespace std;

int main(){

int n,ans[22];

memset(ans,0,sizeof(ans));//

ans[3]=4;ans[4]=6;ans[7]=12;ans[8]=40;ans[11]=171;ans[12]=410;  ans[15] = 1896;ans[16]=5160;ans[19]=32757;ans[20]=59984;

while(cin>>n)

cout<<ans[n]<<endl;

return 0;

}

//二、

#include <iostream>

using namespace std;

class Triangle {

friend int compute(int);

private:

void Backtrack(int t);

int n,     //第一行的符号个数

half,  //n*(n+1)/4

count, //当前‘+’个数

**p;  //幸运三角形矩阵

long sum; //已找到的幸运三角形个数

};

void Triangle::Backtrack(int t) {

if((count>half)||(t*(t-1)/2-count>half))//当搜索到此层时,如果‘+‘或’-‘有大于总符号的一半,就退出;

return ;

int i,j;

if(t>n)

sum++;

else   for(i=0;i<2;i++)   {

p[1][t]=i;

count+=i;

for(j=2;j<=t;j++)    {

p[j][t-j+1]=p[j-1][t-j+1]^p[j-1][t-j+2]; //由p[1][t]的值退出t左斜下方的符号;

count+=p[j][t-j+1]; //如果为1 则

count++;

}    Backtrack(t+1);

for(j=2;j<=t;j++)

count-=p[j][t-j+1];

count-=i;

}

}

int compute(int n)//计算节点为n的幸运三角形的个数;

{  Triangle x;

x.n=n;

x.count=0;

x.half=n*(n+1)/2;

x.sum=0;

if(x.half%2==1)//如果三角形中总符号数为奇数,则返回0;

return 0;

x.half=x.half/2;

int i,j;

int **p=new int *[n+1];

for(i=0;i<=n;i++)

p[i]=new int [n+1];

for(i=0;i<=n;i++)

for(j=0;j<=n;j++)

p[i][j]=0;  x.p=p;

x.Backtrack(1);

return x.sum;

}

int main() {

int n;

while(cin>>n)  {

int res=compute(n);

cout<<res<<endl;

}

return 0;

}

时间: 2024-11-12 19:28:14

搜索---幸运三角形的相关文章

HDU 2510 符号三角形 NYOJ491 幸运三角形

符号三角形 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 860    Accepted Submission(s): 437 Problem Description 符号三角形的 第1行有n个由"+"和"-"组成的符号 ,以后每行符号比上行少1个,2个同号下面是"+",2个异 号下面

NYOJ491幸运三角形

幸运三角形 时间限制:1000 ms  |  内存限制:65535 KB 难度:3 描述 话说有这么一个图形,只有两种符号组成(‘+’或者‘-’),图形的最上层有n个符号,往下个数依次减一,形成倒置的金字塔形状,除第一层外(第一层为所有可能情况),每层形状都由上层决定,相邻的符号相同,则下层的符号为‘+’,反之,为‘-’;如下图所示(n = 3 时的两种情况): 如果图中的两种符号个数相同,那这个三角形就是幸运三角形,如上图中的图(2). 输入 有多组测试数据(少于20组).每行含一个整数n(0

nyoj 491 幸运三角形 【DFS】+【打表】

幸运三角形 时间限制:1000 ms  |  内存限制:65535 KB 难度:3 描述 话说有这么一个图形,只有两种符号组成('+'或者'-'),图形的最上层有n个符号,往下个数依次减一,形成倒置的金字塔形状,除第一层外(第一层为所有可能情况),每层形状都由上层决定,相邻的符号相同,则下层的符号为'+',反之,为'-';如下图所示(n = 3 时的两种情况): 如果图中的两种符号个数相同,那这个三角形就是幸运三角形,如上图中的图(2). 输入 有多组测试数据(少于20组). 每行含一个整数n(

nyoj 491 幸运三角形 (dfs + 打表 出现木马 哈哈)

题目491 题目信息 运行结果 本题排行 讨论区 幸运三角形 时间限制:1000 ms  |  内存限制:65535 KB 难度:3 描述 话说有这么一个图形,只有两种符号组成('+'或者'-'),图形的最上层有n个符号,往下个数依次减一,形成倒置的金字塔形状,除第一层外(第一层为所有可能情况),每层形状都由上层决定,相邻的符号相同,则下层的符号为'+',反之,为'-';如下图所示(n = 3 时的两种情况): 如果图中的两种符号个数相同,那这个三角形就是幸运三角形,如上图中的图(2). 输入

NYOJ-491 幸运三角形

幸运三角形 时间限制:1000 ms  |  内存限制:65535 KB 难度:3 描述 话说有这么一个图形,只有两种符号组成('+'或者'-'),图形的最上层有n个符号,往下个数依次减一,形成倒置的金字塔形状,除第一层外(第一层为所有可能情况),每层形状都由上层决定,相邻的符号相同,则下层的符号为'+',反之,为'-';如下图所示(n = 3 时的两种情况): 如果图中的两种符号个数相同,那这个三角形就是幸运三角形,如上图中的图(2). 输入 有多组测试数据(少于20组). 每行含一个整数n(

FZU2111

在平面上给你N个点,找出有几个锐角三角形.做法简单,先求出所有三角形个数(c n3).开三个for循环,搜索所有三角形,是钝角或直角就减一.直接上代码吧. #include <stdio.h> #include <math.h> int main() { __int64 n,i,j,k,sum,sum1,sum2; double a[5000],b[5000]; scanf("%I64d",&n); while(n--) { __int64 m; sum

HDU4324——DFS——Triangle LOVE

http://acm.hdu.edu.cn/showproblem.php?pid=4324 /* 搜索一个三角形,用vector+vis来减少复杂度 */ /************************************************ * Author :Powatr * Created Time :2015-8-25 10:42:01 * File Name :E.cpp ************************************************/

matlab常用操作备忘

(1)管理命令和函数 addpath  :添加目录到MATLAB搜索路径 doc      :在Web浏览器上现实HTML文档 help     :显示Matlab命令和M文件的在线帮助 helpwin helpdesk :help 兄弟几个 lookfor  :在基于Matlab搜索路径的所有M文件中搜索关键字 partialpath:部分路径名      8*) path     :所有关于路径名的处理 pathtool :一个不错的窗口路径处理界面 rmpath   :删除搜索路径中指定目

【bzoj1853】[Scoi2010]幸运数字 容斥原理+搜索

题目描述 在中国,很多人都把6和8视为是幸运数字!lxhgww也这样认为,于是他定义自己的“幸运号码”是十进制表示中只包含数字6和8的那些号码,比如68,666,888都是“幸运号码”!但是这种“幸运号码”总是太少了,比如在[1,100]的区间内就只有6个(6,8,66,68,86,88),于是他又定义了一种“近似幸运号码”.lxhgww规定,凡是“幸运号码”的倍数都是“近似幸运号码”,当然,任何的“幸运号码”也都是“近似幸运号码”,比如12,16,666都是“近似幸运号码”. 现在lxhgww