zoukankan      html  css  js  c++  java
  • poj2312Battle City BFS

    题意: M行N列矩阵, 'Y'表示开始位置, 'T'表示目标位置, 从开始位置到目标位置至少需要走多少步,其中, 'S', 'R'表示不能走, 'B' 花费为2, 'E'花费为1.

    思路:纯 BFS.

    很久没写BFS, 刚写居然不知道从何下手...

     1 #include <iostream>
     2 #include <queue>
     3 using namespace std;
     4 
     5 struct postion
     6 {
     7     int i, j;
     8     postion operator+(postion p)
     9     {
    10         postion t;
    11         t.i = this->i+ p.i;
    12         t.j = this->j+ p.j;
    13         return t;
    14     }
    15 };
    16 
    17 postion dir[] = {1,0, -1,0, 0,1, 0,-1};
    18 
    19 int step[305][305];
    20 //bool used[305][305];
    21 queue<postion>que;
    22 char map[305][305];
    23 postion start, target;
    24 int M, N;
    25 
    26 int main()
    27 {
    28     int  i, j;
    29     while (cin>>M>>N && M+N)
    30     {
    31         for (i=0; i<M; i++)
    32             for (j=0; j<N; j++)
    33             {
    34                 cin>>map[i][j];
    35                 step[i][j] = INT_MAX;
    36                 if (map[i][j] == 'Y')
    37                     start.i = i, start.j = j;
    38                 else if (map[i][j] == 'T')
    39                     target.i = i, target.j = j;
    40             }
    41             //memset(used, false, sizeof(used));
    42             //memset(step, 0, sizeof(step));
    43             //used[start.i][start.j] = true;
    44             step[start.i][start.j] = 0;
    45             while (!que.empty())que.pop();
    46             que.push(start);
    47             postion tmp, t;
    48             int sp;
    49             while (!que.empty())
    50             {
    51                 tmp = que.front();
    52                 que.pop();
    53                 for (i=0; i<4; i++)
    54                 {
    55                     t = tmp + dir[i];
    56                     if (t.i<0 || t.i>=M || t.j<0 || t.j>=N || map[t.i][t.j] == 'R' || map[t.i][t.j] == 'S')
    57                         continue;
    58                     if (map[t.i][t.j] == 'E')
    59                         sp = 1;
    60                     if (map[t.i][t.j] == 'B')
    61                         sp = 2;
    62                     if (step[t.i][t.j] > step[tmp.i][tmp.j] + sp)
    63                     {
    64                         step[t.i][t.j] = step[tmp.i][tmp.j] + sp;
    65                         que.push(t);
    66                     }
    67                 }
    68             }
    69             if (step[target.i][target.j] == INT_MAX)
    70                 step[target.i][target.j] = -1;
    71             cout<<step[target.i][target.j]<<endl;
    72     }
    73     return 0;
    74 }
    View Code
  • 相关阅读:
    html----响应式布局,左侧栏目固定,右侧内容随着屏幕宽度变化而变化
    es6----set map应用场景
    html----实现元素上下左右居中
    html----怎样实现元素的垂直居中
    html----BFC独立渲染区
    js-----new一个对象的过程
    解决ios手机上传竖拍照片旋转90度的问题
    软键盘遮挡问题
    在不同浏览器中,input里面的输入光标大小表现形式却大不相同
    样式兼容开头
  • 原文地址:https://www.cnblogs.com/lv-2012/p/3148334.html
Copyright © 2011-2022 走看看