标签:blog io os sp for 2014 log bs cti
题目:一个机器人从一个起始点出发(只能上、下、左、右运动),经过一些点后回到起点,求总路径最小长度。
分析:图论,搜索。两点间的距离为:abs(x1-x2)+ abs(y1-y2);每个点必须至少经过一次。
如果存在一个点走过多次,那么他一定在其他两点间的路径上,则这个点可以不经过这么多次;
因此我们只考虑每个点经过一次的情况即可(可能存在点在某两点路径上),求出全排列,枚举最优解。
说明:过度自信的起源难道是自卑╮(╯▽╰)╭。
#include <algorithm> #include <iostream> #include <cstdlib> #include <cstring> #include <cstdio> #include <cmath> using namespace std; int save[3628800][11],temp[11],used[11],Count; void dfs(int d, int n) { if (d == n) { for (int i = 0 ; i < d ; ++ i) save[Count][i] = temp[i]; Count ++; return; } for (int i = 0 ; i < n ; ++ i) if (!used[i]) { used[i] = 1; temp[d] = i; dfs(d+1, n); temp[d] = i; used[i] = 0; } } int x[11],y[11]; int main() { int T,N,M,s_x,s_y,D; while (cin >> T) while (T --) { cin >> N >> M >> s_x >> s_y >> D; for (int i = 0 ; i < D ; ++ i) cin >> x[i] >> y[i]; Count = 0; dfs(0, D); int Min = 444444; for (int i = 0 ; i < Count ; ++ i) { int dist = abs(s_x-x[save[i][0]]) + abs(s_y-y[save[i][0]]); for (int j = 1 ; j < D ; ++ j) dist += abs(x[save[i][j-1]]-x[save[i][j]]) + abs(y[save[i][j-1]]-y[save[i][j]]); dist += abs(s_x-x[save[i][D-1]]) + abs(s_y-y[save[i][D-1]]); Min = min(Min, dist); } cout << "The shortest path has length " << Min << endl; } return 0; }
UVa 10496 - Collecting Beepers
标签:blog io os sp for 2014 log bs cti
原文地址:http://blog.csdn.net/mobius_strip/article/details/41760453