木棒三角形问题

Description:
   小A家里有很多长度不一样的木棍,有一天他很无聊,只能摆弄这些木棒来解闷了。小A的数学学得很好,所以他想在这些木棒中挑出3根来组成一个直角三角形,当然,他有可能有很多种选法,所以他还想挑出一个面积最大的。
Input:
  输入有多组,每组输入包括2行,第一行输入一个n(0<=n<=100),表示小A有n根木棍,接着一行有n个整数(<=1000),表示木棍的长度(长度从小到大给出)。
Output:
输出面积最大的直角三角形的面积,且保留3位小数,如果不能组成,输出“My Good!”
 
Sample Input:
  4
  1 2 3 4
  5
  2 3 4 5 6
  6
  3 4 5 6 8 10
  2
  1 1
Sample Output:
  My Good!
  6.000
  24.000
  My Good!

View Code
  1 #include <stdio.h>
  2 
  3 /*
  4  * 判断数据是否构成直角三角形
  5  * p<q<r
  6  */
  7 int istriangle(int p, int q, int r)
  8 {
  9     return (p+q > r) && (p*p+q*q == r*r) ? 1 : 0;
 10 }
 11 
 12 /*
 13  * 求解前n个数据中构成直角三角形的最大面积
 14  */
 15 void max(int i, int *data, int *m, int *n, int *t, int *smax)
 16 {    
 17     int j, k, s;
 18 
 19     if (i <= 2) {
 20         if (istriangle(data[0], data[1], data[2])) {
 21             *m = 0;
 22             *n = 1;
 23             *t = 2;
 24             *smax = data[0] * data[1];
 25         }
 26         return ;
 27     }
 28 
 29     max(i-1, data, m, n, t, smax); //递归调用
 30 
 31     for (j = 0; j < *m; j++) {
 32         for (k = *n; k < i; k++) {
 33             if (istriangle(data[j], data[k], data[i])) {
 34                 *m = j;
 35                 *n = k;
 36                 *t = i;
 37                 s = data[j] * data[k];
 38                 *smax = *smax > s ? *smax : s;
 39             }
 40         }
 41     }
 42 
 43     for (j = *m; j < i; j++) {
 44         for (k = j+1; k < i; k++) {
 45             if (istriangle(data[j], data[k], data[i])) {
 46                 *m = j;
 47                 *n = k;
 48                 *t = i;
 49                 s = data[j] * data[k];
 50                 *smax = *smax > s ? *smax : s;
 51             }
 52         }
 53     }
 54 
 55     for (j = *n; j < i; j++) {
 56         for (k = j+1; k < i; k++) {
 57             if (istriangle(data[j], data[k], data[i])) {
 58                 *m = j;
 59                 *n = k;
 60                 *t = i;
 61                 s = data[j] * data[k];
 62                 *smax = *smax > s ? *smax : s;
 63             }
 64         }
 65     }
 66     return ;
 67 }
 68 
 69 /*
 70  *    一组木棒长度数组,计算其构成直角三角形的最大面积。
 71  *  若无法构成直角三角形,返回0
 72  */
 73 
 74 int triangle(int len, int *data)
 75 {
 76     int m = -1, n = -1, t = -1, smax = 0;
 77 
 78     if (len < 3 || data == NULL) {//木棒数据不足3个或数据为NULL,一定无法构成直角三角形。
 79         return 0;
 80     }
 81     
 82     max(len, data, &m, &n, &t, &smax);
 83     
 84     return smax;
 85 }
 86 
 87 int main(int argc, char **argv)
 88 {
 89     int max = 0;
 90     int data[] = {1, 1};
 91 
 92     
 93     max = triangle(2, data);
 94     
 95     if (max <= 0) {
 96         printf("My Good!\n");
 97         return 0;
 98     }
 99     printf("ss%d\n", max);
100 
101     return 0;
102 }

 

 

posted @ 2013-01-24 14:08  楼兰故居  阅读(482)  评论(0)    收藏  举报