麦田

麦田

时间限制: 1 Sec  内存限制: 128 MB

题目描述

我心里有一簇迎着烈日而生的花,
比一切美酒都要芬芳,
滚烫的馨香淹没过稻草人的胸膛,
草扎的精神,从此万寿无疆。
凝视深渊的人,深渊也在凝视你。
我不是凝视深渊的人,我就是深渊。
Marser 来到了一片麦田。他想穿过这片麦田,去找副词一起学习。

但是,他发现这片麦田有一些特殊的性质。我们可以把麦田抽象成一片 n×mn \times mn×m 的网格,每个格子上都有一个数字。同时,Marser 按如下的方式表示前进的方向:

如果往与所在格子上数字相同的方向前进,Marser 不需要花费体力;而往其他方向前进时,Marser 就需要额外花费 1单位的体力。

现在,Marser 想知道,从给定的起点前进到给定的终点,最少需要消耗多少体力?

输入

第一行两个整数 n,m(n,m≤1000),表示麦田的大小。
接下来 n 行,每行一个长度为 m 的字符串,表示每个格子上的数字。
接下来一行,四个整数 xs,ys,xt,yt,表示起点和终点的位置。

输出

输出一行一个整数,表示最少需要消耗的体力。

样例输入

5 5
04125
03355
64734
72377
02062
4 2 4 2

样例输出

0

题解

  技巧型的bfs,就是向不同与当前位置上的标记方向不同的方向走时花费1体力,否则不花费体力。我是使用了一个双端队列存储遍历过的点,如果是花费0体力,就放在队首,否则插入在队尾,这样可以保证队列中的花费体力是单调递增的。

 1 #include<queue>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<iostream>
 5 using namespace std;
 6 const int N = 1009;
 7 struct Node
 8 {
 9     int x, y;
10 };
11 int n, m, sx, sy, tx, ty;
12 char c[N][N];
13 int gx[] = {-1, -1, 0, 1, 1, 1, 0, -1};
14 int gy[] = {0, 1, 1, 1, 0, -1, -1, -1};
15 Node q[N*N];
16 int f[N][N], head, tail;
17 int main()
18 {
19     scanf("%d%d", &n, &m);
20     for(int i = 1; i <= n; i++)
21         scanf("%s", c[i]+1);
22     scanf("%d%d%d%d", &sx, &sy, &tx, &ty);
23     memset(f, 0x3f, sizeof(f));
24     q[++tail] = (Node){sx, sy};
25     f[sx][sy] = 0;
26     while(head < tail)
27     {
28         Node now = q[++head];
29         if(now.x == tx && now.y == ty) break;
30         for(int i = 0; i < 8; i++)
31         {
32             int x = now.x + gx[i];
33             int y = now.y + gy[i];
34             if(x < 1 || x > n || y < 1 || y > m) continue;
35             if(i == c[now.x][now.y] - '0')
36             {
37                 if(f[now.x][now.y] < f[x][y])
38                 {
39                     f[x][y] = f[now.x][now.y];
40                     q[head--] = (Node){x, y};
41                 }
42             }
43             else if(f[now.x][now.y] + 1 < f[x][y])
44             {
45                 f[x][y] = f[now.x][now.y] + 1;
46                 q[++tail] = (Node){x, y};
47             }
48         }
49     }
50     printf("%d\n", f[tx][ty]);
51     return 0;
52 }
View Code

 

 
posted @ 2020-05-21 21:23  Johnny-English  阅读(321)  评论(0编辑  收藏  举报