原来会的题,即使一次过,也要敲好久代码
纪念今天没来得及调试笔试的编程题。输在时间没有规划好,慢了一步。
晚上重新花半个小时复盘一下,笔试的时候还是很多小细节没做好。。
这个代码肯定也不是最好的,不确定能不能过掉全部测试用例,毕竟笔试已经结束了。。
#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;
}

查看8道真题和解析