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;
}