• poj 2312(bfs+priority_queue)


    开始的时候想的是bfs。对于每个砖头step+2,然后wa了。看了discuss明白了。这样的话就相当于别的方向只走了一步,而砖头的这个方向是两步,不符合搜索的公平性。

    然后把queue换成priority_queue就ac了。

    数据:

    8 10
    YEEEEEBBBB
    BBBEEEEEEE
    BBBBBBEEEE
    BBBBREEEEE
    EEEEEEBBBB
    BBBBBBBEEE
    EEEEEEEEEE
    BBBBBEEEET
    17
    
    10 10
    YEEEEEBBBB
    BBBEEEEEEE
    BBBBBBEEEE
    RRRRBBBBBE
    BBEERSSSEE
    BBBBREEEEE
    EEEEEEBBBB
    BBBBBBBEEE
    EEEEEEEEEE
    BBBBBEEEET
    19
    View Code
     1 // File Name: 2312.cpp
     2 // Author: Missa
     3 // Created Time: 2013/2/19 星期二 11:56:37
     4 
     5 #include<iostream>
     6 #include<cstdio>
     7 #include<cstring>
     8 #include<algorithm>
     9 #include<cmath>
    10 #include<queue>
    11 #include<stack>
    12 #include<string>
    13 #include<vector>
    14 #include<cstdlib>
    15 #include<map>
    16 #include<set>
    17 using namespace std;
    18 #define CL(x,v) memset(x,v,sizeof(x));
    19 const int dir[4][2]={-1,0,1,0,0,-1,0,1};
    20 const int maxn = 305;
    21 int n,m;
    22 struct Point
    23 {
    24     int x,y;
    25     int step;
    26     Point(){}
    27     Point(int x,int y,int step):x(x),y(y),step(step){}
    28     bool operator <(const Point&a)const
    29     {
    30         return step>a.step;
    31     }
    32 };
    33 char g[maxn][maxn];
    34 bool vis[maxn][maxn];
    35 int bfs(Point st)
    36 {
    37     priority_queue<Point>q;
    38     while(!q.empty()) q.pop();
    39     vis[st.x][st.y]=1;
    40     q.push(st);
    41     while(!q.empty())
    42     {
    43         Point cur=q.top();q.pop();
    44         //cout<<cur.x<<" "<<cur.y<<endl; 
    45         if(g[cur.x][cur.y]=='T') return cur.step;
    46         for(int i=0;i<4;i++ )
    47         {
    48             Point nt;
    49             nt.x=cur.x+dir[i][0];
    50             nt.y=cur.y+dir[i][1];
    51             nt.step=cur.step+1;
    52             if(nt.x<=0 || nt.y<=0 || nt.x>n || nt.y>m) continue;
    53             if(vis[nt.x][nt.y] || g[nt.x][nt.y]=='S' || g[nt.x][nt.y]=='R') continue;
    54             if(g[nt.x][nt.y]=='B') nt.step++;
    55             vis[nt.x][nt.y]=1;
    56             q.push(nt);
    57         }
    58     }
    59     return -1;
    60 }
    61 int main()
    62 {
    63     while(~scanf("%d%d",&n,&m))
    64     {
    65         if(!n && !m) break;
    66         CL(g,0);
    67         CL(vis,0);
    68         for(int i=1;i<=n;i++)
    69             scanf("%s",g[i]+1);
    70         bool flag=0;
    71         for(int i=1;i<=n;i++)
    72         {
    73             for(int j=1;j<=m;j++)
    74             {
    75                 if(g[i][j]=='Y')
    76                 {
    77                     printf("%d\n",bfs(Point(i,j,0)));
    78                     flag=1;
    79                     break;
    80                 }
    81             }
    82             if(flag) break;
    83         }
    84     }
    85     return 0;
    86 }
  • 相关阅读:
    ARM与MIPS平台优劣对比分析
    ARM11Linux2.6ButtonDriverBaseinfo1
    程序员都应该阅读的十一本名书
    驱动设计ARM(6410)按键驱动0基础知识点
    创业编程七个错误认识
    ARM11Linux2.6ButtonDriverBaseinfo
    Arm设计思想与高效C语言编程联系
    个人软件已死?
    评价一个软件的3个角度
    我对北理FTP联盟的建议
  • 原文地址:https://www.cnblogs.com/Missa/p/2917254.html
Copyright © 2020-2023  润新知