zoukankan      html  css  js  c++  java
  • POJ 3271 BFS (大坑)

    被某人拉进了坑 完完全全被坑一天的题……
    题意:
    这里写图片描述
    这里写图片描述
    正解思路:
    先把每一个点搜一遍 预处理出它能在一步之内到的所有点 并连边
    然后用一个类似DP的东西把方案数加起来就搞定了
    (其实 也不是很难)

    但是
    我为什么会挂呢
    首先 我想偷个懒,想少写一个BFS 就直接按照原来的边搜过去了
    当然错了
    查了一上午
    (对着数据查 小数据竟然全水过去了!!!)

    下午颓了会儿
    没发现错,,,,,,
    晚上在车上的时候 思考人生
    诶呦woc?
    有荷叶的时候路径不能简单的加和!
    要搞定所有的新边

    回家以后 乖乖写了第二个BFS 秒切…….

    以下是把我拉近坑的那个人的题解:

    所以基本思路 搜索 从起点到原点的路径 是水面的就加1。
    所以稍微处理了一下,预处理每一个点的需要加1个荷叶的点。1个就好
    然后从原点bfs一遍,遇到可以更新的点即 长度大于新的。就把ans从新赋值并且push进去,如果等于就ans【v】+=ans【u】
    所以puts答案就好了。
    上午一支不对主要在于。一开始的荷叶处理,我想dfs的搜就有可能绕远了,但是其实每个点是可以重复经过的。可是不加vis就会跪。不如循环着 预处理一下每一个点

    看起来她很机智嘛

    //By SiriusRen
    #include <queue>
    #include <cstdio>
    #include <cstring>
    #include <algorithm>
    using namespace std;
    int n,m,a[33][33],dis[999],sp,ep;
    long long ans[999];
    int xx[]={2,2,1,1,-1,-1,-2,-2},yy[]={1,-1,2,-2,2,-2,1,-1};
    int first[999],next[99999],v[99999],tot;
    bool check(int x,int y){
        return x>=1&&x<=n&&y>=1&&y<=m&&a[x][y]!=2;
    }
    void add(int x,int y){
        v[tot]=y,next[tot]=first[x],first[x]=tot++;
    }
    void BFS(int X,int Y){
        int vis[33][33];
        memset(vis,0,sizeof(vis));
        queue<pair<int,int> >q;
        q.push(make_pair(X,Y)),vis[X][Y]=1;
        while(!q.empty()){
            int x=q.front().first,y=q.front().second;q.pop();
            for(int i=0;i<8;i++){
                int dx=x+xx[i],dy=y+yy[i];
                if(check(dx,dy)&&!vis[dx][dy]){
                    vis[dx][dy]=1;
                    if(a[dx][dy]==1)q.push(make_pair(dx,dy));
                    else add(X*m+Y,dx*m+dy);
                }
            }
        }
    }
    void bfs(){
        queue<int>q;
        q.push(sp);memset(dis,0x3f,sizeof(dis));
        dis[sp]=0,ans[sp]=1;
        while(!q.empty()){
            int t=q.front();q.pop();
            for(int i=first[t];~i;i=next[i]){
                if(dis[v[i]]>dis[t]+1){
                    dis[v[i]]=dis[t]+1;
                    ans[v[i]]=ans[t];
                    q.push(v[i]);
                }
                else if(dis[v[i]]==dis[t]+1)
                    ans[v[i]]+=ans[t];
            }
        }
    }
    int main(){
        memset(first,-1,sizeof(first));
        scanf("%d%d",&n,&m);
        for(int i=1;i<=n;i++)
            for(int j=1;j<=m;j++){
                scanf("%d",&a[i][j]);
                if(a[i][j]==3)sp=i*m+j;
                else if(a[i][j]==4)ep=i*m+j;
            }
        for(int i=1;i<=n;i++)
            for(int j=1;j<=m;j++)
                BFS(i,j);
        bfs();
        if(dis[ep]<=0x3fffff)printf("%d
    %lld",dis[ep]-1,ans[ep]);
        else puts("-1");
    }
    

    这里写图片描述

  • 相关阅读:
    js中的replace替换全部
    Oracle中创建数据链
    Hbuildx+vue+axios+element ui初学部署
    html5抠图
    Oracle误删除数据的恢复方法
    vs 生成项目自动关闭当前运行程序
    Mvc项目在iis上面显示文件夹 输入地址页面也打不开
    FastReport快速打印(.net)
    脚本之家
    VS自定义作者、创建时间
  • 原文地址:https://www.cnblogs.com/SiriusRen/p/6532252.html
Copyright © 2011-2022 走看看