zoukankan      html  css  js  c++  java
  • bfs模板

    模板:

    #include<bits/stdc++.h>
    using namespace std;
    typedef long long ll;
    #define MAX 1010
    #define INF 0x3f3f3f3f
    int n,m;
    int T;
    char g[MAX][MAX];
    bool vis[MAX][MAX];
    int fire[MAX][MAX];
    int ans=INF;
    int dx[]={0,1,0,-1},dy[]={1,0,-1,0};
    int sx,sy;
    int fx,fy;
    struct mask
    {
        int x,y,step;
        mask(){}
        mask(int x,int y,int step):x(x),y(y),step(step){};
    };
    queue<mask>q;
    bool check(int a,int b){return 0<=a&&a<n&&0<=b&&b<m;}
    void fire_path()
    {
        memset(vis,false,sizeof(vis));
        memset(fire,0,sizeof(fire));
        while(q.size()) q.pop();//
        q.push(mask(fx,fy,0));//
        vis[fx][fy]=true;
        fire[fx][fy]=0;
        while(q.size())
        {
            mask tmp=q.front();q.pop();
            for(int i=0;i<4;i++)
            {
                int nx=tmp.x+dx[i];
                int ny=tmp.y+dy[i];
                if(check(nx,ny)&&!vis[nx][ny])
                {
                    vis[nx][ny]=true;
                    fire[nx][ny]=tmp.step+1;
                    q.push(mask(nx,ny,tmp.step+1));
                }
            }
        }
    }
    void bfs()
    {
        memset(vis,false,sizeof(vis));
        while(q.size()) q.pop();
        vis[sx][sy]=true;
        q.push(mask(sx,sy,0));
        while(q.size())
        {
            mask tmp=q.front();q.pop();
            if(g[tmp.x][tmp.y]=='E')
            {
                ans=min(ans,tmp.step);
                return ;
            }
            for(int i=0;i<4;i++)
            {
                int nx=dx[i]+tmp.x;
                int ny=dy[i]+tmp.y;
                if(g[nx][ny]=='E'&&tmp.step+1<=fire[nx][ny])
                {
                     vis[nx][ny]=true;
                    q.push(mask(nx,ny,tmp.step+1));
                }
                if(check(nx,ny)&&!vis[nx][ny]&&g[nx][ny]!='#'&&tmp.step+1<fire[nx][ny])
                {
                     vis[nx][ny]=true;
                    q.push(mask(nx,ny,tmp.step+1));
                }
            }
        }
    }
    int main()
    {
        while(cin>>n>>m){
       for(int i=0;i<n;i++)
       {
           cin>>g[i];
           for(int j=0;j<m;j++)
           {
               if(g[i][j]=='S')
               {
                   sx=i;
                   sy=j;
               }
               if(g[i][j]=='F')
               {
                   fx=i;
                   fy=j;//cout<<i<<j<<endl;
               }
           }
         }
         ans=INF;
          fire_path();
          /*for(int i=0;i<n;i++)
          {
              for(int j=0;j<m;j++)
                cout<<fire[i][j];
              cout<<endl;
          }*/
          bfs();
          if(ans==INF)
            cout<<"A! WO SI LA!"<<endl;
          else cout<<"PIG PIG PIG!"<<endl;
        }
       }
    View Code
  • 相关阅读:
    命令模式
    装饰者模式
    迭代器模式-统一集合的遍历方式
    springboot源码解析-管中窥豹系列之总体结构
    启动项目tomcat报错
    在项目中部署redis的读写分离架构(包含节点间认证口令)
    Redis的几个核心机制底层原理
    Java内存模型
    JAVA原子组件和同步组件
    DataGrid 删除一行数据
  • 原文地址:https://www.cnblogs.com/linhaitai/p/10051350.html
Copyright © 2011-2022 走看看