搜索算法 problem(1014)

来源:互联网 发布:2017年各月m2数据 编辑:程序博客网 时间:2024/05/17 01:40

1.简明题意

有一个特别的电梯,第i层有一个对应的数字ki, 对于第i层按上升键up可升上到i+k[i]层,按下降键down到达i-k[i]层,到达的楼层最高不能超过n层,最低不能小于1层。给你一个起点A和终点B,问最少要按几次上升键或者下降键到达目的地。

2.解题思路

把每一层都看成一个节点,问题就可以变成求起点到终点的最短路径问题。

3.AC代码

    #include<cstdio>      #include<cstring>      #define maxn 250      #define INF 0x3f3f3f3f      int dp[maxn], floor[maxn][2];      int main()      {          int n, a, b;          while (scanf("%d", &n), n)          {              scanf("%d %d", &a, &b);              memset(floor, -1, sizeof(floor));              for (int i = 1; i <= n; i++)              {                  int t;                  scanf("%d", &t);                  if (i + t <= n)                      floor[i][0] = i + t;                  if (i - t >= 1)                      floor[i][1] = i - t;              }              memset(dp, 0x3f, sizeof(dp));              dp[a] = 0;              while (true)              {                  int num = 0;                  for (int i = 1; i <= n; i++) if (dp[i]<INF)                      for (int j = 0; j<2; j++) if (floor[i][j] != -1)                          if (dp[floor[i][j]]>dp[i] + 1)                              dp[floor[i][j]] = dp[i] + 1, num++;                  if (num == 0)                      break;              }              if (dp[b] == INF)                  dp[b] = -1;              printf("%d\n", dp[b]);          }          return 0;      }  


0 0