• BFS入门篇——RQNOJ195&&335


    PID195 / 校园迷宫

    从x,y走到去q,w的最小步数,限制是有的点可走,有的点不可走,BFS嘛。

    #include<bits/stdc++.h>
    
    using namespace std;
    
    int n,m,a[2005][2005],b[2005][2005],q,w,e,r,ans;
    
    int dx[]={0,0,1,-1},
        dy[]={1,-1,0,0};
    
    queue<pair<int,int> >Q;
    bool vis[2005][2005];
    void bfs(){
        vis[q][w]=1;
        Q.push(make_pair(q,w));
        while(!Q.empty()){
            int x=Q.front().first,y=Q.front().second;Q.pop();
            if(x==e&&y==r){
                ans=b[x][y];
                break;
            }
            for(int i=0;i<4;i++)
            {
                int tx=x+dx[i],ty=y+dy[i];
                if(tx>=1&&ty>=1&&tx<=n&&ty<=m&&!vis[tx][ty]&&!a[tx][ty]){
                    b[tx][ty]=b[x][y]+1;
                    vis[tx][ty]=1;
                    Q.push(make_pair(tx,ty));
                }
            }
        }
    }
    
    int main()
    {
        scanf("%d%d",&n,&m);
        for(int i=1;i<=n;i++){
            for(int j=1;j<=m;j++){
                scanf("%d",&a[i][j]);
            }
        }
        scanf("%d%d%d%d",&q,&w,&e,&r);
        bfs();
        if(!ans) printf("No Answer!
    ");
        else printf("%d
    ",ans);
        return 0;
    }

    PID335 / 流星雨

     

    Bessie听说有一场壮丽的流星雨即将来临,而且据说陨石将要落下来撞击地球并摧毁一切它遇到的东西。为了保证自己的安全,bessie决定到一个安全的(永远不会被陨石击毁)地方去。

    报道表明将有M颗陨石落下(1 ≤ M ≤ 50,000),第i个陨石将在Ti(0 ≤ Ti ≤ 1,000)时刻砸中(Xi,Yi)点(0 ≤ Xi ≤ 300; 0 ≤ Yi ≤ 300) 。每颗陨石将击毁它直接砸中的点以及四个与其直接相邻的点

    她现在所处的地方是坐标系的原点,并从零时刻起出发,前往一个安全的地点,要求是她经过某点时该点未被击毁。她只能在坐标系的第一象限以及x,y轴的正半轴上活动。

    求她能到达一个安全地点的最短时间。

    BFS嘛,跟上一题差不多

    #include<bits/stdc++.h>
    
    using namespace std;
    
    int a[505][505],m;
    
    int b[2005][2005],ans=-1;
    
    int dx[]={0,0,1,-1},
        dy[]={1,-1,0,0};
    
    queue<pair<int,int> >Q;
    bool vis[2005][2005];
    void bfs(){
        vis[0][0]=1;
        Q.push(make_pair(0,0));
        while(!Q.empty()){
            int x=Q.front().first,y=Q.front().second;Q.pop();
    //        if(x==0&&y==0) goto end;
            if(a[x][y]>1000){
                ans=b[x][y];
                break;
            }
    //        end:
            for(int i=0;i<4;i++)
            {
                int tx=x+dx[i],ty=y+dy[i];
                if(tx>=0&&ty>=0&&tx<=400&&ty<=400&&!vis[tx][ty]&&a[tx][ty]>b[x][y]+1){
                    b[tx][ty]=b[x][y]+1;
                    vis[tx][ty]=1;
                    Q.push(make_pair(tx,ty));
                }
            }
        }
    }
    
    int main()
    {
        scanf("%d",&m);
        memset(a,0x3f,sizeof(a));
        for(int t,x,y,i=1;i<=m;i++){
            scanf("%d%d%d",&x,&y,&t);
            a[x][y]=min(t,a[x][y]);
            for(int k=0;k<4;k++){
                if(x+dx[k]>=0&&y+dy[k]>=0)
                    a[x+dx[k]][y+dy[k]]=min(a[x+dx[k]][y+dy[k]],t);
            }
        }
        bfs();
        printf("%d
    ",ans);
        return 0;
    }

    2999: 卫星照片 USACO 2005 NOV

    求出最大的联通块大小

    #include<bits/stdc++.h>
    
    using namespace std;
    
    int n,m;
    char a[1005][1005];
    int ans;
    
    int dx[]={0,0,1,-1},
        dy[]={1,-1,0,0};
    
    bool vis[2005][2005];
    
    queue<pair<int,int> >Q;
    
    int bfs(int x,int y){
        int an=0;
        Q.push(make_pair(x,y));
        vis[x][y]=1;
        while(!Q.empty()){
            int x=Q.front().first,y=Q.front().second;Q.pop();++an;
            for(int i=0;i<4;i++){
                int tx=x+dx[i],ty=y+dy[i];
                if(!vis[tx][ty]&&a[tx][ty]=='*'&&tx>=1&&ty>=1&&tx<=n&&ty<=m){
                    vis[tx][ty]=1;
                    Q.push(make_pair(tx,ty));
                }
            }
        }
        return an;
    }
    
    int main()
    {
        scanf("%d%d",&m,&n);
        for(int i=1;i<=n;i++){
            for(int j=1;j<=m;j++){
                cin>>a[i][j];
            }
        }
        for(int i=1;i<=n;i++){
            for(int j=1;j<=m;j++){
                if(!vis[i][j]&&a[i][j]=='*'){
                    ans=max(bfs(i,j),ans);
                }
            }
        }
        printf("%d
    ",ans);
        return 0;
    }
  • 相关阅读:
    C#生成PDF总结
    Oracle删除当前用户下所有的表的方法
    C#操作oracle 到ExecuteNonQuery卡死不执行
    C#中事件的使用
    初探three.js光源
    d3.js 地铁轨道交通项目实战
    初探three.js
    d3.js 绘制北京市地铁线路状况图(部分)
    d3.js 共享交换平台demo
    d3.js 实现烟花鲜果
  • 原文地址:https://www.cnblogs.com/song-/p/9628191.html
Copyright © 2020-2023  润新知