zoukankan      html  css  js  c++  java
  • UVA 11573 Ocean Currents

    用优先队列代替普通队列,这是不是叫权值优先搜索?

    注意的是与普通队列不同,需要在进队后马上标记,不能等到访问结点的时候再标记,避免多次进队导致复杂度太高。

    而普通队列是无所谓的。

    // #pragma comment(linker, "/STACK:1024000000,1024000000")
    #include<cstdio>
    #include<cstring>
    #include<cstdlib>
    #include<algorithm>
    #include<iostream>
    #include<sstream>
    #include<cmath>
    #include<climits>
    #include<string>
    #include<map>
    #include<queue>
    #include<vector>
    #include<stack>
    #include<set>
    using namespace std;
    typedef long long ll;
    typedef pair<int,int> pii;
    #define pb(a) push_back(a)
    #define INF 0x1f1f1f1f
    #define lson idx<<1,l,mid
    #define rson idx<<1|1,mid+1,r
    
    void debug()
    {
    #ifdef ONLINE_JUDGE
    #else
        freopen("d:\in.txt","r",stdin);
        freopen("d:\out1.txt","w",stdout);
    #endif
    }
    char getch()
    {
        char ch;
        while((ch=getchar())!=EOF)
        {
            if(ch!=' '&&ch!='
    ')return ch;
        }
        return EOF;
    }
    
    struct point
    {
        int x,y,t;
        point() {}
        point (int a,int b,int e)
        {
            x=a;
            y=b;
            t=e;
        }
        bool operator < (point a) const
        {
            return t>a.t;
        }
    };
    char plat[1010][1010];
    int n,m;
    int vis[1010][1010];
    int dx[]={-1,-1,0,1,1,1,0,-1};
    int dy[]={0,1,1,1,0,-1,-1,-1};
    int bfs(int x,int y,int aimx,int aimy)
    {
        memset(vis,INF,sizeof(vis));
        priority_queue<point> q;
        q.push(point(x,y,0));
        vis[x][y]=0;
        while(!q.empty())
        {
            point p=q.top();q.pop();
            if(p.x==aimx&&p.y==aimy)return p.t;
           // if(vis[p.x][p.y]<=p.t)continue;
           // vis[p.x][p.y]=p.t;
            for(int d=0;d<8;d++)
            {
                point np;
                np.x=p.x+dx[d];np.y=p.y+dy[d];np.t=p.t+(d==plat[p.x][p.y]-'0'?0:1);
                if(np.x>=1&&np.x<=n&&np.y>=1&&np.y<=m&&vis[np.x][np.y]>np.t)
                {
                    q.push(np);
                    vis[np.x][np.y]=np.t;
                }
    
            }
    
        }
        return -1;
    }
    int main()
    {
        while(scanf("%d%d",&n,&m)!=EOF)
        {
            for(int i=1;i<=n;i++)
                scanf("%s",plat[i]+1);
            int q;
            scanf("%d",&q);
            for(int Q=1;Q<=q;Q++)
            {
                int x1,x2,y1,y2;
                scanf("%d%d%d%d",&x1,&y1,&x2,&y2);
                int k=bfs(x1,y1,x2,y2);
                printf("%d
    ",k);
            }
        }
        return 0;
    }
    View Code
  • 相关阅读:
    生成XML文件。
    使用EHCache需要注意的几个问题
    Spring @Value取值为null或@Autowired注入失败
    Windows安装mosquitto
    Linux学习
    hive 日期格式转换
    正则表达式验证字符串是否为IP
    string字符串根据指定字符进行截取转成对应的集合
    CENTOS7自用简单配置
    git的简单使用
  • 原文地址:https://www.cnblogs.com/BMan/p/3272455.html
Copyright © 2011-2022 走看看