〖編程·C++〗回溯算法:子集树 - 符号三角形问题

 问题描述:给出一个数,表示符号三角形第一行的符号的个数,如果第一个和第二个符号相同则下一行的第一个符号为‘+’号,否则为‘-’号,例如下方三角形:

若三角形中的加号和减号数目相等,则输出这个三角形,并且输出加减号相等的三角形的总数目。

样例:

input.txt

3

output.txt

 

 源程序代码:

 

源程序代码
  1 #include <fstream>
  2 using namespace std;
  3 
  4 ifstream fin("f:\\fuhaosanjiaoxing\\input.txt");
  5 ofstream fout("f:\\fuhaosanjiaoxing\\output.txt");
  6 int n,plus,sum;
  7 
  8 int **p;
  9 
 10 
 11 void output(int **m)
 12 {
 13     int i,j;
 14     for(i=1;i<=n;i++)
 15     {
 16         for(int q=0;q<i;q++)
 17                 fout<<' ';
 18         for(j=1;j<=n-i+1;j++)
 19             fout<<(p[i][j]==1?'+':'-')<<' ';
 20 
 21         fout<<endl;
 22     }
 23     fout<<endl;
 24 
 25 
 26 }
 27 
 28 int backtrack(int t)
 29 {
 30     int i,j;
 31     if(t>n) { sum++; output(p); return 1;}
 32 
 33     else
 34         for(i=0;i<=1;i++)
 35         {
 36             p[1][t] = i;
 37             plus+=i;
 38             if(t>=2)
 39             {
 40                 for(j=2;j<=t;j++)
 41                 {
 42                     p[j][t-j+1] = p[j-1][t-j+2]==p[j-1][t-j+1]?1:0;
 43                     plus+=p[j][t-j+1];
 44                 }
 45             }
 46 
 47             if((plus > n*(n+1)/4) || (t*(t+1)/2-plus > n*(n+1)/4))
 48             {
 49                 for(j=2;j<=t;j++)
 50                     plus -=p[j][t-j+1];
 51                 plus-=i;
 52             }
 53             else
 54             {
 55                 backtrack(t+1);
 56                 
 57                 for(j=2;j<=t;j++)
 58                     plus -=p[j][t-j+1];
 59                 plus-=i;
 60             }
 61         }
 62         return 1;
 63 
 64 }
 65 
 66 int main()
 67 {
 68     fin>>n;
 69     sum=0;
 70     plus=0;
 71     
 72     //如果输入的数所形成的三角形符号个数为奇数,没必要进行判断,直接输出0
 73     if((n*(n+1)/2)%2!=0)
 74     {
 75         fout<<sum;
 76         return 1;
 77     }
 78     
 79     if(n>15)
 80     {
 81         fout<<"输入数值过大,不予运行"<<endl;
 82         return 0;
 83     }
 84 
 85 
 86 
 87     p = new int*[n+1];
 88     for(int i=1;i<=n;i++)
 89         p[i] = new int[n-i+2];
 90 
 91     backtrack(1);
 92     
 93     fout<<sum;
 94     
 95     for(int i=1;i<=n;i++)
 96         delete p[i];
 97     delete p;
 98 
 99     return 1;
100 
101 }

 

 

 

posted @ 2012-12-02 21:20  TBD  阅读(560)  评论(0编辑  收藏  举报