改一处,各要重做几个

👁️ 0 人浏览 💬 0 人评论 ❤️ 添加收藏

改了一处,是全都重来,还是只做几个

全都重来

只做几个

(本条路线统一用 gcc -std=c11 -O0 -Wall 编译)把一份最小的依赖表写成数组,顺着它数一数:

#include <stdio.h>
#include <string.h>

/* 一份最小的 Makefile 依赖表:谁依赖谁 */
#define N 5
static const char *name[N] = {"util.h", "util.c", "main.c", "util.o", "app"};
/* dep[i][j] = 1 表示 i 一变,j 就得重做 */
static const int dep[N][N] = {
    /*        util.h util.c main.c util.o app */
    /*util.h*/ {0,     0,     0,     1,     0},
    /*util.c*/ {0,     0,     0,     1,     0},
    /*main.c*/ {0,     0,     0,     0,     1},
    /*util.o*/ {0,     0,     0,     0,     1},
    /*app   */ {0,     0,     0,     0,     0},
};

/* 从 start 出发,顺着依赖一路标记,数出要重做几个 */
static int touched(int start) {
    int mark[N] = {0};
    mark[start] = 1;
    for (int round = 0; round < N; round++)
        for (int i = 0; i < N; i++)
            if (mark[i])
                for (int j = 0; j < N; j++)
                    if (dep[i][j]) mark[j] = 1;
    int n = 0;
    for (int i = 0; i < N; i++) if (mark[i] && i != start) n++;
    return n;
}

int main(void) {
    /* 改 util.h、改 main.c,各要重做几个 */
    printf("%d/%d\n", touched(0), touched(2));
    return 0;
}
提交你的答案
请登录后提交答案。
去登录
代码编辑器
Ctrl + Enter 运行
本次输入:
输出:

                        
👩‍🏫
AI
💬 题目评论

全部评论