【题目描述】
一个row*col的矩阵,给你起点的位置(x,y),还有其他n个目标点,问你从起点出发,走过每个目标点之后返回到你的起点,最短的路径是多少?
【题目描述】
由于点不多,可以直接全排列解决,运用dfs
bool visited[21];
int s, t, x, m, n, path, cnt, ans, my_map[21][2];
void dfs(int a, int b)
{
int tmp, i;
if (cnt == x) {
tmp = path + abs(a - s) + abs(b - t);
if (tmp < ans)
ans = tmp;
return ;
}
for (i = 0; i < x; ++i) {
if (visited[i]) continue;
visited[i] = true;
tmp = abs(my_map[i][0] - a) + abs(my_map[i][1] - b);
++cnt;
path += tmp;
dfs(my_map[i][0], my_map[i][1]);
--cnt;
path -= tmp;
visited[i] = false;
}
}
int main()
{
int cases, i;
cin>>cases;
while (cases--) {
memset(visited, 0, sizeof(visited));
path = cnt = 0;
ans = 0x7fffffff;
cin>>m>>n;
cin>>s>>t;
cin>>x;
for (i = 0; i < x; ++i) {
cin>>my_map[i][0]>>my_map[i][1];
}
dfs(s, t);
printf("The shortest path has length %d\n", ans);
}
return 0;
}