习题日常第十五练

1最短路计数(题目链接

这个题是迪杰斯特拉算法的一个运用。每次拓展点的时候,拓展点的距离如果需要被更新,则它的方案数是更新它的点的方案数,如果更新点时候更新距离与现在距离相等,方案数字相加。具体代码如下。

#include<cmath>
#include <iostream>
#include<stdio.h>
#include<string>
#include<string.h>
#include<vector>
#include<set>
#include<map>
#include<cstring>
#include<math.h>
#include<stack>
#include<algorithm>
#include<queue>
#include<bitset>
#include<sstream>
#define ll long long int
const int mod=100003;
using namespace std;
ll n,m,a[201000],b[201000],tot=0,dis[201000],vis[200010];
struct node
{
    ll next,to,w;
}t[400010];
priority_queue<pair<ll,ll> >p;
void add(ll x,ll y,ll w)
{
    t[++tot].next=a[x];
    a[x]=tot;
    t[tot].to=y;
    t[tot].w=w;
}
int main()
{
    ios::sync_with_stdio(false);
    ll i,j,l,k;
    cin>>n>>m;
    memset(b,0,sizeof(b));
    for(i=1;i<=n;i++)
        a[i]=-1;
    for(i=0;i<m;i++)
    {
        cin>>l>>k;
        add(l,k,1);
        add(k,l,1);
    }
    p.push(make_pair(0,1));
    b[1]=1;
    for(i=1;i<=n;i++)
        dis[i]=1e10;
    dis[1]=0;
    memset(vis,0,sizeof(vis));
    while(!p.empty())
    {
        ll x=p.top().second;
        p.pop();
        if(vis[x])
            continue;
        vis[x]=1;
        for(j=a[x];j!=-1;j=t[j].next)
        {
            if(dis[t[j].to]>dis[x]+t[j].w)
            {
                dis[t[j].to]=dis[x]+t[j].w;
                b[t[j].to]=b[x];
                p.push(make_pair(-dis[t[j].to],t[j].to));
            }
            else if(dis[t[j].to]==dis[x]+t[j].w)
            {
                b[t[j].to]+=b[x];
                b[t[j].to]%=mod;
            }
        }
    }
    for(i=1;i<=n;i++)
        cout<<b[i]<<endl;
  return 0;
}

2机器人搬重物(题目链接

这个题对于我来说还是比较艰难的,从昨天一直在淦这一个题。首先,这个机器人是有体积且在点上运动的,而障碍物是在方格内的,所以一个方格的四个角都是不能走的(边界也是不能走的)。再有就是转弯的时候需要时间,所以我们可以把到每一个点的状态也存下,分为北,东,南,西分别对应0,1,2,3 。所以转弯的时候只需要+4,再+1或者-1(表示左转右转),最后对四取余即为新的方向。主要思想是 bfs和迪杰斯特拉算法。每次搜索的都是优先队列里存的已知时间最少的,拿最少的去更新其它状态(入队的时候不只有坐标,还有方向)。注意更新的时候,如果要走2步,那前面的1步必定是没有障碍的,这个情况需要特别注意。具体代码如下。

#include<cmath>
#include <iostream>
#include<stdio.h>
#include<string>
#include<string.h>
#include<vector>
#include<set>
#include<map>
#include<cstring>
#include<math.h>
#include<stack>
#include<algorithm>
#include<queue>
#include<bitset>
#include<sstream>
#define ll long long int
const int mod=100003;
using namespace std;
int a[60][60],b[60][60][4],n,m,xz,yz,xx,yy,vis[60][60][4],pis[60][60];
char c;
struct node
{
    int h,z,f,w;
     bool operator <(const node &p) const
    {
        return p.w<w;
    }
};
priority_queue<node>q;
bool pan(int x,int y,int f)
{
    if(x>n||x<2||y<2||y>m||pis[x][y])
        return false;
    else
        return true;
}
int main()
{
    ios::sync_with_stdio(false);
    ll i,j,l,k;
    cin>>n>>m;
    node pi;
    memset(vis,0,sizeof(vis));
    memset(pis,0,sizeof(pis));

    for(i=1;i<=n;i++)
        for(j=1;j<=m;j++)
        {
         cin>>a[i][j];
         if(a[i][j])
         {
             int ii=i,jj=j;
            for(k=0;k<4;k++)
                vis[ii][jj][k]=1;
                pis[ii][jj]=1;
                ii=i+1;
                for(k=0;k<4;k++)
                vis[ii][jj][k]=1;
                 pis[ii][jj]=1;
                ii=i;
                jj=j+1;
                 for(k=0;k<4;k++)
                vis[ii][jj][k]=1;
                 pis[ii][jj]=1;
                ii++;
                 for(k=0;k<4;k++)
                vis[ii][jj][k]=1;
                 pis[ii][jj]=1;
         }
        }
    cin>>xx>>yy>>xz>>yz>>c;
    xx++;
    yy++;
    xz++;
    yz++;
    for(i=0;i<=n+5;i++)
        for(j=0;j<=m+5;j++)
          for(k=0;k<4;k++)
          b[i][j][k]=1e9;
    if(c=='N')
    {
        pi.h=xx;
        pi.z=yy;
        pi.f=0;
        b[xx][yy][0]=0;
    }
    if(c=='S')
    {
        pi.h=xx;
        pi.z=yy;
        pi.f=2;
        b[xx][yy][2]=0;
    }
    if(c=='W')
    {
        pi.h=xx;
        pi.z=yy;
        pi.f=3;
        b[xx][yy][3]=0;
    }
    if(c=='E')
    {
        pi.h=xx;
        pi.z=yy;
        pi.f=1;
        b[xx][yy][1]=0;
    }
    pi.w=0;
    q.push(pi);
    while(!q.empty())
    {
        node sp;
        sp=q.top();
        q.pop();
        if(!pan(sp.h,sp.z,sp.f)||vis[sp.h][sp.z][sp.f])
            continue;
        vis[sp.h][sp.z][sp.f]=1;
        if(sp.f==0)
        {
            if(pan(sp.h-1,sp.z,sp.f))
            {
                if(b[sp.h-1][sp.z][sp.f]>b[sp.h][sp.z][sp.f]+1)
                {
                    b[sp.h-1][sp.z][sp.f]=b[sp.h][sp.z][sp.f]+1;
                    node lp;
                    lp=sp;
                    lp.w=b[sp.h-1][sp.z][sp.f];
                    lp.h-=1;
                    q.push(lp);
                }
                if(pan(sp.h-2,sp.z,sp.f))
            {
                if(b[sp.h-2][sp.z][sp.f]>b[sp.h][sp.z][sp.f]+1)
                {
                    b[sp.h-2][sp.z][sp.f]=b[sp.h][sp.z][sp.f]+1;
                    node lp;
                    lp=sp;
                    lp.w=b[sp.h-2][sp.z][sp.f];
                    lp.h-=2;
                    q.push(lp);
                }
                   if(pan(sp.h-3,sp.z,sp.f))
            {
                if(b[sp.h-3][sp.z][sp.f]>b[sp.h][sp.z][sp.f]+1)
                {
                    b[sp.h-3][sp.z][sp.f]=b[sp.h][sp.z][sp.f]+1;
                    node lp;
                    lp=sp;
                    lp.w=b[sp.h-3][sp.z][sp.f];
                    lp.h-=3;
                    q.push(lp);
                }

            }
            }
            }
       }
        if(sp.f==1)
        {
            if(pan(sp.h,sp.z+1,sp.f))
            {
                if(b[sp.h][sp.z+1][sp.f]>b[sp.h][sp.z][sp.f]+1)
                {
                    b[sp.h][sp.z+1][sp.f]=b[sp.h][sp.z][sp.f]+1;
                    node lp;
                    lp=sp;
                    lp.w=b[sp.h][sp.z+1][sp.f];
                    lp.z+=1;
                    q.push(lp);
                }
                if(pan(sp.h,sp.z+2,sp.f))
            {
                if(b[sp.h][sp.z+2][sp.f]>b[sp.h][sp.z][sp.f]+1)
                {
                    b[sp.h][sp.z+2][sp.f]=b[sp.h][sp.z][sp.f]+1;
                    node lp;
                    lp=sp;
                    lp.w=b[sp.h][sp.z+2][sp.f];
                    lp.z+=2;
                    q.push(lp);
                }
                   if(pan(sp.h,sp.z+3,sp.f))
            {
                if(b[sp.h][sp.z+3][sp.f]>b[sp.h][sp.z][sp.f]+1)
                {
                    b[sp.h][sp.z+3][sp.f]=b[sp.h][sp.z][sp.f]+1;
                    node lp;
                    lp=sp;
                    lp.w=b[sp.h][sp.z+3][sp.f];
                    lp.z+=3;
                    q.push(lp);
                }
            }
            }
            }
        }
        if(sp.f==2)
        {
            if(pan(sp.h+1,sp.z,sp.f))
            {
                if(b[sp.h+1][sp.z][sp.f]>b[sp.h][sp.z][sp.f]+1)
                {
                    b[sp.h+1][sp.z][sp.f]=b[sp.h][sp.z][sp.f]+1;
                    node lp;
                    lp=sp;
                    lp.w=b[sp.h+1][sp.z][sp.f];
                    lp.h+=1;
                    q.push(lp);
                }
                if(pan(sp.h+2,sp.z,sp.f))
            {
                if(b[sp.h+2][sp.z][sp.f]>b[sp.h][sp.z][sp.f]+1)
                {
                    b[sp.h+2][sp.z][sp.f]=b[sp.h][sp.z][sp.f]+1;
                    node lp;
                    lp=sp;
                    lp.w=b[sp.h+2][sp.z][sp.f];
                    lp.h+=2;
                    q.push(lp);
                }
                   if(pan(sp.h+3,sp.z,sp.f))
            {
                if(b[sp.h+3][sp.z][sp.f]>b[sp.h][sp.z][sp.f]+1)
                {
                    b[sp.h+3][sp.z][sp.f]=b[sp.h][sp.z][sp.f]+1;
                    node lp;
                    lp=sp;
                    lp.w=b[sp.h+3][sp.z][sp.f];
                    lp.h+=3;
                    q.push(lp);
                }
            }
            }
            }
        }
          if(sp.f==3)
        {
            if(pan(sp.h,sp.z-1,sp.f))
            {
                if(b[sp.h][sp.z-1][sp.f]>b[sp.h][sp.z][sp.f]+1)
                {
                    b[sp.h][sp.z-1][sp.f]=b[sp.h][sp.z][sp.f]+1;
                    node lp;
                    lp=sp;
                    lp.w=b[sp.h][sp.z-1][sp.f];
                    lp.z-=1;
                    q.push(lp);
                }
                if(pan(sp.h,sp.z-2,sp.f))
            {
                if(b[sp.h][sp.z-2][sp.f]>b[sp.h][sp.z][sp.f]+1)
                {
                    b[sp.h][sp.z-2][sp.f]=b[sp.h][sp.z][sp.f]+1;
                    node lp;
                    lp=sp;
                    lp.w=b[sp.h][sp.z-2][sp.f];
                    lp.z-=2;
                    q.push(lp);
                }
                   if(pan(sp.h,sp.z-3,sp.f))
            {
                if(b[sp.h][sp.z-3][sp.f]>b[sp.h][sp.z][sp.f]+1)
                {
                    b[sp.h][sp.z-3][sp.f]=b[sp.h][sp.z][sp.f]+1;
                    node lp;
                    lp=sp;
                    lp.w=b[sp.h][sp.z-3][sp.f];
                    lp.z-=3;
                    q.push(lp);
                }

            }
            }
            }
        }
        node lp;
        lp=sp;
        lp.f=(lp.f+5)%4;
        if(pan(lp.h,lp.z,lp.f)&&b[lp.h][lp.z][lp.f]>b[sp.h][sp.z][sp.f]+1)
        {
            b[lp.h][lp.z][lp.f]=b[sp.h][sp.z][sp.f]+1;
            lp.w++;
            q.push(lp);
        }
        lp=sp;
        lp.f=(lp.f+3)%4;
        if(pan(lp.h,lp.z,lp.f)&&b[lp.h][lp.z][lp.f]>b[sp.h][sp.z][sp.f]+1)
        {
            b[lp.h][lp.z][lp.f]=b[sp.h][sp.z][sp.f]+1;
            lp.w++;
            q.push(lp);
        }
    }
    int ans=b[xz][yz][0];
    for(i=1;i<4;i++)
        ans=min(ans,b[xz][yz][i]);
 if(ans==1e9)
        cout<<-1;
   else
        cout<<ans;
  return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值