日常训练17-10-25

CF877

链接

 

D. Olya and Energy Drinks

bfs

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 const int maxn =1010;
 4 
 5 char mp[maxn][maxn];
 6 int vis[maxn][maxn], dis[maxn][maxn];
 7 
 8 struct Node{
 9     int x, y;
10     Node(int x = 0, int y = 0) : x(x), y(y) {}
11 };
12 
13 int d[4][2] = {0, 1, 0, -1, 1, 0, -1, 0};
14 int sx, sy, ex, ey;
15 int n, m, k;
16 
17 void bfs(){
18     Node p1, p2;
19     queue<Node> q;
20     q.push(Node(sx, sy));
21     vis[sx][sy] = (1<<4) - 1;
22     dis[sx][sy] = 0;
23     while(!q.empty()){
24         p2 = q.front();
25         q.pop();
26         if(p2.x == ex && p2.y == ey) return ;
27         for(int i = 0; i < 4; i++){
28             for(int j = 1; j <= k; j++){
29                 int dx = p2.x + d[i][0] * j;
30                 int dy = p2.y + d[i][1] * j;
31                 if(dx < 0 || dx >= n || dy < 0 || dy >= m || mp[dx][dy] == '#') break;
32                 if(vis[dx][dy] & (1<<i)) break;
33                 int ok = 0;
34                 if(!vis[dx][dy]) ok = 1;
35                 vis[dx][dy] |= (1<<i);
36                 if(ok){
37                     dis[dx][dy] = dis[p2.x][p2.y] + 1;
38                     q.push(Node(dx, dy));
39                 }
40             
41             }
42             
43         }
44     }
45     
46 }
47 
48 int main(){
49     //freopen("in.txt", "r", stdin);
50     memset(dis, -1, sizeof(dis));
51     memset(vis, 0, sizeof(vis));
52     scanf("%d %d %d", &n, &m, &k);
53     for(int i = 0; i < n; i++) scanf("%s", mp[i]);
54     scanf("%d %d %d %d", &sx, &sy, &ex, &ey);
55     sx--; sy--; ex--; ey--;
56     bfs();
57     printf("%d\n", dis[ex][ey]);
58 }
View Code

 

posted @ 2017-10-25 18:22  yijiull  阅读(124)  评论(0编辑  收藏  举报