最近蟻本の初級編をやり直したのだが2-1と2-2の記事がなかったので一応貼り付けとく

部分和問題

bool dfs(int i, int sum) {
    if (i == n) {
        return sum == k;
    }
    if (dfs(i + 1, sum)) {
        return true;
    }
    if (dfs(i + 1, sum + a[i])) {
        return true;
    }
    return false;
}

void solve() {
    if (dfs(0, 0)) {
        cout << "Yes" << endl;
    } else {
        cout << "No" << endl;
    }
}

Lake Counting

int n, m;
char field[110][110];

void dfs(int x, int y) {
    //置き換える
    field[x][y] = '.';

    for (int dx = -1; dx <= 1; ++dx) {
        for (int dy = -1; dy <= 1; ++dy) {
            int nx = x + dx;
            int ny = y + dy;
            if (0 <= nx && nx < n && 0 <= ny && ny < m &&
                field[nx][ny] == 'W') {
                dfs(nx, ny);
            }
        }
    }
}

void solve() {
    int res = 0;
    for (int i = 0; i < n; ++i) {
        for (int j = 0; j < m; ++j) {
            if (field[i][j] == 'W') {
                dfs(i, j);
                res++;
            }
        }
    }
    printf("%d\n", res);
}

迷路の最短路

char maze[MAX_N][MAX_N + 1];
int n, m;
int sx, sy;
int gx, gy;

int d[MAX_N][MAX_N];

//移動4方向ベクトル
int dx[4] = {1, 0, -1, 0};
int dy[4] = {0, 1, 0, -1};

// (sx, sy)から(gx, gy)への最短距離を求める
// たどり着けないとINF
int bfs() {
    queue<P> que;
    //全ての点をINFで初期化
    for (int i = 0; i < n; ++i) {
        for (int j = 0; j < m; ++j) {
            d[i][j] = INF;
        }
    }

    //スタート地点をqueに入れて距離を0にする
    que.push(P(sx, sy));
    d[sx][sy] = 0;

    //キューが空になるまでループ
    while (que.size()) {
        //キューの先頭を取り出す
        P p = que.front();
        que.pop();
        //ゴールなら終了
        if (p.first == gx && p.second == gy) {
            break;
        }
        //移動4方向ループ
        for (int i = 0; i < 4; ++i) {
            //移動した後の点を(nx, ny)とする
            int nx = p.first + dx[i];
            int ny = p.second + dy[i];

            //移動が可能か
            //すでに訪れていないか
            if (0 <= nx && nx < n && 0 <= ny && ny < m && maze[nx][ny] != '#' &&
                d[nx][ny] == INF) {
                //移動できるならばキューに入れて、距離を代入
                que.push(P(nx, ny));
                d[nx][ny] = d[p.first][p.second] + 1;
            }
        }
    }
    return d[gx][gy];
}

void solve() {
    int res = bfs();
    printf("%d\n", res);
}