原来会的题,即使一次过,也要敲好久代码

纪念今天没来得及调试笔试的编程题。输在时间没有规划好,慢了一步。

晚上重新花半个小时复盘一下,笔试的时候还是很多小细节没做好。。

这个代码肯定也不是最好的,不确定能不能过掉全部测试用例,毕竟笔试已经结束了。。

#include <iostream>
#include <vector>
using namespace std;

int res = INT_MIN;
vector<vector<int>> track;  //保存每次全排列的结果
vector<int> player;  //玩家坐标

//计算时间函数
int CalTime(vector<vector<int>> track) {
    int ctime = 0;
    for (auto a : track) {
        ctime = ctime + abs(a[0] - player[0]) + abs(a[1] - player[1]);
    }
    return ctime;
}

//全排列所有的资源
void backtrack(vector<vector<int>>& resource, vector<bool>& used) {
    if (track.size() == resource.size()) {  //全排列满了,计算时间
        if (res == INT_MIN) {  //第一次赋值
            res = CalTime(track);
        }
        res = min(res, CalTime(track));
        return;
    }

    for (int i = 0; i < resource.size(); i++){
        if (used[i]) continue;  //踩过该资源,跳过

        //采集当前资源
        track.push_back(resource[i]);
        used[i] = true;
        backtrack(resource, used);
        track.pop_back();
        used[i] = false;
    }
}

int main() {
    int x, y;
    vector<vector<int>> resource;
    while (cin >> x >> y) {   //把所有数对放入资源数组里,包括最后的玩家坐标
        vector<int> temp(2);
        temp[0] = x; temp[1] = y;
        resource.push_back(temp);

        if (getchar() == '\n')   break;
    }

    int len = resource.size();
    player = resource[len - 1];  //数据给玩家
    resource.pop_back();  //清除玩家数据
    if (len == 1) {  //如果没给资源点,不需要采集,返回0
        cout << 0;
        system("pause");
        return 0;
    }
    vector<bool> used(len, false);  //记录是否踩了资源点

    backtrack(resource, used);
    cout << res;
    
    system("pause");
    return 0;
}

全部评论
点赞 回复 分享
发布于 2023-04-23 10:00 河北

相关推荐

03-07 13:32
门头沟学院 C++
D0cC:你是本科生吗,太厉害了
点赞 评论 收藏
分享
评论
1
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务