麦田
麦田
时间限制: 1 Sec 内存限制: 128 MB题目描述
我心里有一簇迎着烈日而生的花,
比一切美酒都要芬芳,
滚烫的馨香淹没过稻草人的胸膛,
草扎的精神,从此万寿无疆。
凝视深渊的人,深渊也在凝视你。
我不是凝视深渊的人,我就是深渊。
Marser 来到了一片麦田。他想穿过这片麦田,去找副词一起学习。
但是,他发现这片麦田有一些特殊的性质。我们可以把麦田抽象成一片 n×mn \times mn×m 的网格,每个格子上都有一个数字。同时,Marser 按如下的方式表示前进的方向:
如果往与所在格子上数字相同的方向前进,Marser 不需要花费体力;而往其他方向前进时,Marser 就需要额外花费 1单位的体力。
现在,Marser 想知道,从给定的起点前进到给定的终点,最少需要消耗多少体力?
比一切美酒都要芬芳,
滚烫的馨香淹没过稻草人的胸膛,
草扎的精神,从此万寿无疆。
凝视深渊的人,深渊也在凝视你。
我不是凝视深渊的人,我就是深渊。
Marser 来到了一片麦田。他想穿过这片麦田,去找副词一起学习。
但是,他发现这片麦田有一些特殊的性质。我们可以把麦田抽象成一片 n×mn \times mn×m 的网格,每个格子上都有一个数字。同时,Marser 按如下的方式表示前进的方向:
如果往与所在格子上数字相同的方向前进,Marser 不需要花费体力;而往其他方向前进时,Marser 就需要额外花费 1单位的体力。
现在,Marser 想知道,从给定的起点前进到给定的终点,最少需要消耗多少体力?
输入
第一行两个整数 n,m(n,m≤1000),表示麦田的大小。
接下来 n 行,每行一个长度为 m 的字符串,表示每个格子上的数字。
接下来一行,四个整数 xs,ys,xt,yt,表示起点和终点的位置。
接下来 n 行,每行一个长度为 m 的字符串,表示每个格子上的数字。
接下来一行,四个整数 xs,ys,xt,yt,表示起点和终点的位置。
输出
输出一行一个整数,表示最少需要消耗的体力。
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 }