问题描述:给出一个数,表示符号三角形第一行的符号的个数,如果第一个和第二个符号相同则下一行的第一个符号为‘+’号,否则为‘-’号,例如下方三角形:
若三角形中的加号和减号数目相等,则输出这个三角形,并且输出加减号相等的三角形的总数目。
样例:
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 }