1 条题解
-
1
题意:
在一个表格里给出几个点的坐标 从开始点出发,分别经过给出的坐标点,并且在经过最后的一个点的时候再返回到开始点,问最短的步数是多少,只能上下左右移动……
题解:
用深搜,分别搜到每一个点,最后求最短的路径……(开始的时候用做的,本来想可以进行全排列后 ,找出从一个点到下一个点的最短路径 ,最后再加起来,若起点在给出的点的中间的话,并不符合题意,所以用直接遍历每一个给出的坐标,最后在找出最短路径……)
标程
#include <iostream> #include <cstring> #include <stdio.h> #include <cmath> using namespace std; struct node { int x, y; }; int X, Y; int N; int maxstep; const int maxn = 100; int vis[300]; int map[maxn][maxn]; node ps[maxn]; int distance1(int i, int j) { int dx = ps[i].x - ps[j].x; int dy = ps[i].y - ps[j].y; dx = dx > 0 ? dx : -dx; dy = dy > 0 ? dy : -dy; return dx + dy; } void dis(int X, int Y) { int m, n; for (m = 0; m < X; m++) { for (n = 0; n < Y; n++) { // 修正:这里应该计算点m和点n之间的距离 map[m][n] = distance1(m, n); } } } inline int dist(int i, int j) { return map[i][j]; } void dfs(const int start, const int level, const int disyuan) { if (level == N) { int temp = disyuan + dist(start, 0); maxstep = temp < maxstep ? temp : maxstep; return; } for (int i = 1; i <= N; i++) { if (vis[i] == 0) { vis[i] = 1; dfs(i, level + 1, disyuan + dist(i, start)); vis[i] = 0; } } } int main() { int T; cin >> T; while (T--) { cin >> X >> Y; cin >> ps[0].x >> ps[0].y; cin >> N; int i; // C++98要求变量声明在作用域开始处 for (i = 1; i <= N; i++) { cin >> ps[i].x >> ps[i].y; } // 修正:计算所有点之间的距离,而不是整个网格 for (i = 0; i <= N; i++) { for (int j = 0; j <= N; j++) { map[i][j] = distance1(i, j); } } maxstep = 999999999; memset(vis, 0, sizeof(vis)); dfs(0, 0, 0); cout << "The shortest path has length " << maxstep << endl; } return 0; }
- 1
信息
- ID
- 1908
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- 递交数
- 1
- 已通过
- 1
- 上传者