蓝桥打卡-Day13

酶和ATP 2022年03月21日 621次浏览

1.带分数(全排列) https://www.lanqiao.cn/problems/208/learning/

#include <cstdio>
#include <cstring>
#include <iostream>
using namespace std;
long n;           // 这是目标
int cnt;          // 计数器
bool number[10];  // 1-9 代表九位数字,flase 表示没用过,true 表示用过了
int state[10];      // 表示10位数字
long a, b, c, tmp;  // n=100 * c == a * c + b
void dfs(int u) {
    // 如果大于9,就代表穷举数字结束了,9 个位置都有数字s了
    if (u > 9) {
        /* dfs 测试语句
        for (int i = 1; i <= 9; i++) printf("%d", state[i]);
        puts("");
        */
        //那现在就是把这数字分割开来,分成 a, b,c 三部分
        // 先砍一刀在ab之间,目的是把 a 分出来
        for (int ab = 1; ab <= 9; ab++) {
            //再砍一刀,把 b 分出来
            for (int bc = ab + 1; bc <= 9; bc++) {
                int a = 0, b = 0, c = 0;
                tmp = ab;
                for (tmp; tmp != 0; tmp--) {
                    a = a * 10 + state[tmp];
                    if (a >= n) break;  // 剪枝
                }
                // cout << "a=" << a << endl;
                tmp = bc;
                for (tmp; tmp != ab; tmp--) {
                    b = b * 10 + state[tmp];
                }
                // cout << "b=" << b << endl;
                tmp = 9;
                for (tmp; tmp != bc; tmp--) {
                    c = c * 10 + state[tmp];
                }
                // cout << "c=" << c << endl;

                // cout << a << " " << b << " " << c << endl;
                //    都选择完了,那就看看是不是符合条件喽
                if (n * c == a * c + b) {
                    cnt++;
                    return;
                }
            }
        }
    }
    // 否则没结束,还有位数是空的
    // 先把 u 这一位的数字给确定了
    for (int i = 1; i <= 9; i++) {
        if (!number[i]) {
            // 如果没用过,就往下递推
            number[i] = true;
            state[u] = i;
            dfs(u + 1);
            number[i] = false;
        }
    }
}
int main() {
    scanf("%ld", &n);
    //这个意思表示第一位,123456789,总共九位
    dfs(1);
    printf("%d", cnt);
    return 0;
}
2.走迷宫(bfs)https://www.lanqiao.cn/problems/1216/learning/

#include <algorithm>
#include <cstring>
#include <iostream>
#include <queue>
#define x first
#define y second
using namespace std;

typedef pair<int, int> PII;
const int N = 110;
int n, m;

int map[N][N];
int idx[N][N];

int dx[4] = {0, -1, 0, 1}, dy[4] = {-1, 0, 1, 0};

void bfs(int x1, int y1, int x2, int y2) {
    memset(idx, -1, sizeof idx);
    queue<PII> q;
    q.push({x1, y1});
    idx[x1][y1] = 0;
    while (!q.empty()) {
        auto t = q.front();
        for (int i = 0; i < 4; i++) {
            int x = t.x + dx[i], y = t.y + dy[i];
            if (x < 1 && y < 1 && x > m && y > n) continue;
            if (map[x][y] == 0) continue;
            if (idx[x][y] != -1) continue;
            idx[x][y] = idx[t.x][t.y] + 1;
            q.push({x, y});
            if (x == x2 && y == y2) return;
        }
        q.pop();
    }
    return;
}

int main() {
    scanf("%d%d", &n, &m);

    for (int i = 1; i <= n; i++)
        for (int j = 1; j <= m; j++) scanf("%d", &map[i][j]);

    int x1, y1, x2, y2;

    scanf("%d%d%d%d", &x1, &y1, &x2, &y2);

    bfs(x1, y1, x2, y2);

    if (idx[x2][y2] != -1)
        printf("%d\n", idx[x2][y2]);
    else
        printf("-1\n");

    return 0;
}

3.蓝桥幼儿园(并查集)https://www.lanqiao.cn/problems/1135/learning/
4.跳石头(贪心+二分)https://www.lanqiao.cn/problems/364/learning/