下图为5个放置在9x8 的点阵中的方框图:
若将他们按顺序叠放起来.则会有某些框的一部分盖住了另外一个框,遮住一些部分.
下图是这5个框叠放起来的图形:
那么这些方框从下至上叠放的顺序是什么呢?
答案是: EDABC.
你的任务是对于一个给定的方框叠放以后的图形, 找出他们从下至上的叠放顺序.
下面是一些规则:
(1). 方框的边宽度为一个字符,边长不少于3个字符;
(2). 每个方框的4条边都有一部分可见, 一个角代表两条边;
(3). 方框用大写字母了表示, 没有两个方框用相同的字符来表示.
格式
输入格式
前两行每行一个数字,分别表示长、宽。
接下来为框叠起来的图。没有框的地方用'.'表示。
输出格式
输出全部可能情况。
按字典顺序排序。
#重叠的方框
拓扑排序不知道怎么输出所有可能顺序
代码块:
#include <stdio.h>
#include <stdlib.h>
void aver_fcourse(int *s[4], int n); //定义函数1
void two_fail(int *s[4], int m, int n); //定义函数2
void high_score(int *s[4], int m, int n); //定义函数3
int main()
{
int *stu_score[4], i, j;
for (i=0; i<4; i++){
stu_score[i]=(int *)malloc(3*sizeof(int)); //给学生成绩分配动态空间
printf("Please enter No.%d student score: ", i+1); //输入学生成绩
for (j=0; j<5; scanf("%d", *(stu_score+i)+j), j++);
}
aver_fcourse(stu_score, 4); //调用函数1
two_fail(stu_score, 4, 5); //调用函数2
high_score(stu_score, 4, 5); //调用函数3
return 0;
}
//函数1
void aver_fcourse(int *s[4], int n)
{
int i;
float sum;
for (i=0, sum=0; i<n; sum+=*s[i++]);
printf("The first course average score: %.2f\n", sum/n);
}
//函数2
void two_fail(int *s[4], int m, int n)
{
int i, j, k, cc;
float sum;
for (i=0; i<m; i++){
for (j=0, cc=0; j<n; *(*(s+i)+j)<60 ? cc++, j++ : j++);
if (cc>=2){
printf("No.%d student is fail. Score: ", i+1);
for (k=0, sum=0; k<n; printf("%d ", *(*(s+i)+k)), sum+=*(*(s+i)+k), k++);
printf("\nAverage=%.2f\n", sum/n);
}
}
}
//函数3
void high_score(int *s[4], int m, int n)
{
int i, j, cc;
float sum, aver;
for (i=0; i<m; i++){
for (j=0, cc=0, sum=0; j<n; sum+=*(*(s+i)+j), *(*(s+i)+j)>85 ? cc++, j++ : j++);
aver=sum/n;
if (aver>90||cc==5)
printf("No.%d student is high score.\n", i+1);
}
}