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