几道略有难度的C语言题 求高人给出源代码解决办法

几道略有难度的C语言题 求高人给出源代码
A:大学的大楼
时间限制: 1000ms 
内存限制: 10000kB
描述 
大学中的高富帅,天天在盖高楼,不断扩张。校长请ACM团队统计一下学校的高楼。请你讲学校的高楼排个序,按楼的高度从高到低,若高度相同,则占地面积大的在前,假设所有高楼都是规则的长方体。
输入 
输入T组数据,第一行输入T,每组第一行输入一个n,表示楼的个数,接下去n行输入n个楼的长、宽、高,都是整数。(每个楼都有个序号,1~n号楼顺序输入) 
输出 
输出排序后楼的序号顺序。
样例输入 
2
2
1 2 3
2 2 4
3
1 1 1
2 2 2
3 3 3
样例输出 
2
1
3
2
1

B:上楼梯
时间限制: 1000ms 
内存限制: 10000kB 
描述 
一个人上楼梯,他可以一步上1级,可以一步上2级,也可以
一步上3级,现在楼梯一共有N级,有多少种不同的上法
(注意:当上到还剩下1级就到达时,不能直接上2级且不能
直接上3级,当上到还剩下2级就到达时,不能直接上3级), 
输入 
输入第一个数是M,表示M组测试数据,接下来有M行,每组测试数
据一行,为一个N(1<=N<=35) 
输出 
对于每一个测试数据,输出对应的不同的上楼梯方法 
样例输入 
3
1
5
10
样例输出 
1
13
274

C:集合合并
时间限制: 3000ms 
内存限制: 50000kB 
描述 
已知集合A与集合B,且第个集合内数据是唯一的。求A,B集合合并成新的集合C,要求C集合内的数据也是唯一的。并指出C集合的个数。
输入 
三行,第一行分别为集合A,B的个数
第二行为A集合的数据
第三行为B集合的数据 
输出 
两行
第一行集合C的个数
第二行为C集合的数据 
样例输入 
4 5
12 34 56 78
34 67 89 34 76
样例输出 
7
12 34 56 78 67 89 76
提示 
数据小于30000 

D:mirror number
时间限制: 1000ms 
内存限制: 100000kB 
描述 
像1,101,2552这样对称的数,我们称它为mirror number,前10个mirror 
number为1,2,3,4,5,6,7,8,9,11。以此类推。
请你求出第N个对称的数。
输入 
第一行输入T,T组测试数据,接下去每组数据占一行,输入一个N(1<=N<=100000)。 
输出 
输出第N个mirror number,每组占一行。 
样例输入 
3
2
11
15
样例输出 
2
22
66

E:有人说这是acm题
时间限制: 1000ms 
内存限制: 10000kB 
描述 
最近一个老师和我们说,我给你们布置一个acm题。题目是这样的,给定矩阵大小,请你输出一个蛇形的字符串矩阵。从左上角开始蛇形顺时针转,从A开始按26个大写字母顺序,到Z后再回到A。你们说这个题难吗??
输入 
第一行输入T,表示输入T组数据。每组占一行,分别输入n,m表示行数和列数。(1<=n,m<=50) 
输出 
输出矩阵。 
样例输入 
3
2 2
3 5
10 5
样例输出 
AB
DC
ABCDE
LMNOF
KJIHG
ABCDE
ZABCF
YRSDG
XQTEH
WPUFI
VOVGJ
UNWHK
TMXIL
SLKJM
RQPON

F:取糖果
时间限制: 1000ms 
内存限制: 10000kB 
描述 
女生节到了,ACM团队要给ACM的女生们发糖果啦,不过调皮的男生要写考考女生们一个小问题。
把n个糖果连成一排,要把这些糖果拿光,刚开始可以任取一个,接下去只能取“有相邻的糖果被取走”的糖果,例如刚开始有5个糖果,刚开始取走第3个,第二步只能取第2或第4个,以此类推。给出n,问将糖果取光的方法有多少种。两种取法只要有某次取的糖果不一样就视为不同。
输入 
输入T组数据,第一行输入T。
接下去T行,每组数据输入一个整数n(1<=n<=100)。 
输出 
每组数据输出一行,为将糖果取光的方法数,结果模1000000007。 
样例输入 
2
1
2
样例输出 
1
2


------解决方案--------------------
慢慢写吧,先送上第一题
C/C++ code

#include<stdio.h>

/*使用结构体来表示大楼*/
struct building {
    int length;
    int width;
    int height;
};

int main(){

    /*记录多少组数据*/
    int group;
    /*记录每一组数据里面有多少个大楼,我假定的最多50,这个可以是N*/
    int count[50];
    int i, j, k;
    /*记录总共有多少个大楼*/
    int temp = 0;
    /*记录输入的大楼,假定最多100个大楼*/
    struct building building[100];
    /*中间变量,排序时使用*/
    struct building tempBuilding;

    printf("Please enter the group of data:");
    scanf("%d", &group);
    for(i=0;i<group;i++){
        printf("Please enter the count of building:");
        scanf("%d", &count[i]);
        for(j=0; j< count[i]; j++){
            printf("Please enter the length width height of this building:");
            scanf("%d%d%d", &building[temp].length, &building[temp].width, &building[temp].height);
            temp ++;
        }
    }

    /*对每一组的大楼进行排序,时间复杂度不够好,不过对于这题的要求是没有关系的,凑合着使吧*/
    for(i=0;i<group;i++){
        for(j=i*group;j<(count[i]-1)*group;j++){
            for(k=j;k<(count[i]-1)*group;k++){
                if(building[j].height < building[k+1].height){
                    tempBuilding = building[k+1];
                    building[k+1] = building[j];
                    building[j] = tempBuilding;
                }
                else if(building[j].height == building[k+1].height && building[j].length*building[j].width < building[k+1].length*building[k+1].width){
                    tempBuilding = building[k+1];
                    building[k+1] = building[j];
                    building[j] = tempBuilding;
                }
            }
        }
    }

    /*输出排序后的大楼*/
    for(i=0;i<temp;i++){
        printf("%d\t%d\t%d \n", building[i].length, building[i].width, building[i].height);
    }


    getch();
    return 0;
}