• NBUT 1642 简单的图论问题? BFS记忆化搜索+优先队列


    https://ac.2333.moe/Problem/view.xhtml?id=1642

    第一种情况直接用个BFS优先队列就可以了。

    第二种情况对路径进行记录,采用三维数组防止死循环。

    #include<cstdio>
    #include<iostream>
    #include<cstring>
    #include<queue>
    #include<algorithm>
    using namespace std;
    char s[100];
    int n,m,r1,c1,r2,c2,ans1,ans2;
    int map[600][600],vis[600][600],use[600][600][5];
    int dir[4][2]={1,0,0,1,-1,0,0,-1};
    struct node{
        int x,y,sum,op;
    };
    bool operator<( node a, node b ){
        return a.sum>b.sum;
    }
    int check(int x,int y)
    {
        if(x>=0&&x<n&&y>=0&&y<m)
        return 1;
        return 0;
    }
    void bfs1()
    {
        priority_queue<node>Q;
        node p,q,next;
        p.x=r1;p.y=c1;
        memset(vis,0,sizeof(vis));
        vis[p.x][p.y]=1;
        p.sum=map[r1][c1];
        Q.push(p);
        while(!Q.empty())
        {
            q=Q.top();
            Q.pop();
            if(q.x==r2&&q.y==c2)
            {
                ans1=q.sum;
                return;
            }
            for(int i=0;i<4;i++)
            {
                next.x=q.x+dir[i][0];
                next.y=q.y+dir[i][1];
                if(!check(next.x,next.y)||vis[next.x][next.y]||map[next.x][next.y]==-1)
                continue;
                next.sum=q.sum+map[next.x][next.y];
                vis[next.x][next.y]=1;
                Q.push(next);
            }
        }
        return;
    }
    void bfs2()
    {
        priority_queue<node>Q;
        node p,q,next;
        p.x=r1;p.y=c1;
        p.sum=map[r1][c1];
        memset(use,0,sizeof(use));
        p.op=-1;
        Q.push(p);
        while(!Q.empty())
        {
            q=Q.top();
            Q.pop();
            if(q.x==r2&&q.y==c2)
            {
                ans2=q.sum;
                return;
            }
            for(int i=0;i<4;i++)
            {
                if(i==q.op)
                continue;
                next.x=q.x+dir[i][0];
                next.y=q.y+dir[i][1];
                if(!check(next.x,next.y)||use[q.x][q.y][i]||map[next.x][next.y]==-1)
                continue;
                next.sum=q.sum+map[next.x][next.y];
                use[q.x][q.y][i]=1;
                next.op=i;
                Q.push(next);
            }
        }
        return;
    }
    main()
    {
        int i,j,k,cas=1;
        while(scanf("%d%d%d%d%d%d",&n,&m,&r1,&c1,&r2,&c2)!=EOF)
        {
            r1--,r2--,c1--,c2--;
            for(i=0;i<n;i++)
            {
                for(j=0;j<m;j++)
                {
                    scanf("%s",s);
                    int len=strlen(s);int vir=0;
                    if(s[0]=='*') map[i][j]=-1;
                    else
                    {
                        for(k=0;k<len;k++)
                        vir=vir*10+s[k]-'0';
                        map[i][j]=vir;
                }
            }
        }
            ans1=-1;ans2=-1;
            bfs1();
            bfs2();
            printf("Case %d: %d %d
    ",cas++,ans1,ans2);
        }
    }
  • 相关阅读:
    二叉查找中使用位运算符
    Python2021专业版激活码
    南邮计算机方向
    7.字符串、异常处理、文件和流(C++学习笔记)
    6.多态与抽象(C++学习笔记)
    5.对象类与继承(C++学习笔记)
    4.数组与指针(C++学习笔记)
    3.C++函数(C++学习笔记)
    2.C++控制语句(C++学习笔记)
    1.基本知识(C++学习笔记)
  • 原文地址:https://www.cnblogs.com/CrazyBaby/p/5765391.html
Copyright © 2020-2023  润新知