题解:P15021 [UOI 2020 II Stage] 方程

· · 题解

显然可以暴力枚举。\ 然而这种算法太低级了,考虑使用橙题难度的搜索及回溯算法。

::::info[Code]

#include <iostream>
using namespace std;

int a[4], k;
int tmp[4];//答案数组

bool vis[4];//标记是否用过

inline bool check() {//检查是否正确
    int x = tmp[1], y = tmp[2], z = tmp[3];
    return (x * x * x + y * y + z == k);
}

inline void dfs(int k) {
    if (k > 3) {
        if (check()) {
            cout << tmp[1] << ' ' << tmp[2] << ' ' << tmp[3];
            exit(0);//退出程序
        }

        return ;
    }

    for (register int i = 1; i <= 3; ++i) {//一一遍历
        if (vis[i]) {
            continue;
        }

        tmp[k] = a[i];
        vis[i] = true;
        dfs(k + 1);
        vis[i] = false;//回溯
    }
}

int main() {
    cin >> a[1] >> a[2] >> a[3] >> k;
    dfs(1);
    cout << "-1 -1 -1";//无解
    return 0;
}

::::