标签:
题意:给出一个n*m的矩阵,矩阵里面只有少于等于10个的非0值,现在需要将所有的非0值运到左上角((1,1)处),问最少需要多长时间,起点在(1,1)处。
#include<stdio.h> #include<string.h> #include<queue> #include<math.h> #include<stdlib.h> #include<algorithm> using namespace std; const int N=1e2+10; const int INF=0x3f3f3f3f; const int MOD=1e9+7; typedef long long LL; struct node { int x, y; }no[N]; int a[N][N], n, m, k, ans, vis[N]; ///vis标记点是否被查找过 void DFS(int x, int y, int num, int Time) ///x,y表示当前非0值的位置,num表示已经查找到的非0值,Time表示到达所有非0值需要的时间 { int i, T; if (Time >= ans) return ; ///如果这次的时间比最小值大,那么回溯,不继续查找(不回溯会超时) if (num == k) ///当找到所有非0值时更新最小值 { ans = min(ans, Time+x+y-2); ///此时的x,y是最后一个非0值的位置,那么x+y-2表示从这个位置回到起点的时间 return ; } for (i = 0; i < k; i++) { if (!vis[i]) { vis[i] = 1; T = Time + abs(x-no[i].x) + abs(y-no[i].y); ///不能直接用Time,因为下次如果Time不符合会回溯,那么时间会增多 DFS(no[i].x, no[i].y, num+1, T); vis[i] = 0; } } } int main () { int i, j; while (scanf("%d%d", &n, &m) != EOF) { k = 0; ans = INF; memset(vis, 0, sizeof(vis)); for (i = 1; i <= n; i++) { for (j = 1; j <= m; j++) { scanf("%d", &a[i][j]); if (a[i][j]) { no[k].x = i; ///将非0值的位置保存下来 no[k++].y = j; } } } DFS(1, 1, 0, 0); ///从起点开始搜索 printf("%d\n", ans); } return 0; }
HDU 5067 Harry And Dig Machine(BestCoder Round #14)
标签:
原文地址:http://www.cnblogs.com/syhandll/p/4932682.html