• 〖編程·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 }
  • 相关阅读:
    Nginx proxy开启cache缓存
    Nginx Server 配置
    nginx 全局配置
    Nginx 配置文件解析
    Python-Scrapy框架
    Python-shutil模块
    os模块3
    os模块
    python os模块atime ,ctime,mtime意义
    Python-正则表达式
  • 原文地址:https://www.cnblogs.com/shaoweinan/p/2798678.html
Copyright © 2020-2023  润新知