题意:
电梯每层有一个不同的数字,例如第n层有个数字k,那么这一层只能上k层或下k层,但是不能低于一层或高于n层,给定起点与终点,要求出最少要按几次键。
思路:
可以用BFS,也可以用迪杰斯特拉算法。
1 #include2 #include 3 #include 4 #include 5 using namespace std; 6 7 #define INF 100000000 8 9 int n, A, B;10 int map[205][205];11 int vis[205];12 int d[205];13 int num[205];14 15 void Dijkstra()16 {17 memset(vis, 0, sizeof(vis));18 for (int i = 1; i <= n; i++)19 {20 num[i] = map[A][i];21 }22 num[A] = 0;23 vis[A] = 1;24 for (int i = 1; i < n; i++)25 {26 int min = INF;27 int pos;28 for (int j = 1; j <= n; j++)29 {30 if (num[j] < min && !vis[j])31 {32 pos = j;33 min = num[j];34 }35 }36 if (min == INF) break;37 vis[pos] = 1;38 for (int j = 1; j <= n; j++)39 {40 if (num[pos] + map[pos][j] < num[j] && !vis[j])41 num[j] = num[pos] + map[pos][j];42 }43 }44 if (num[B] == INF) printf("-1\n");45 else printf("%d\n", num[B]);46 }47 48 int main()49 {50 //freopen("D:\\txt.txt", "r", stdin);51 int a;52 while (scanf("%d", &n) && n)53 {54 scanf("%d%d", &A, &B);55 for (int i = 1; i <= n; i++)56 for (int j = 1; j <= n; j++)57 map[i][j] = INF;58 for (int i = 1; i <= n; i++)59 {60 scanf("%d", &a);61 if (i + a <= n)62 map[i][i + a] = 1;63 if (i - a >= 0)64 map[i][i - a] = 1; 65 }66 Dijkstra();67 }68 return 0;69 }