码迷,mamicode.com
首页 > 其他好文 > 详细

搜索---幸运三角形

时间:2016-05-20 22:28:00      阅读:221      评论:0      收藏:0      [点我收藏+]

标签:

//一、

#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;

}

搜索---幸运三角形

标签:

原文地址:http://www.cnblogs.com/CAOYR/p/5513489.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!