社区讨论
求调玄关
P1979[NOIP 2013 提高组] 华容道参与者 1已保存回复 0
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 0 条
- 当前快照
- 1 份
- 快照标识符
- @lp0vq5za
- 此快照首次捕获于
- 2023/11/16 15:38 2 年前
- 此快照最后确认于
- 2023/11/16 17:20 2 年前
CPP
#include<bits/stdc++.h>
#include<queue>
#define int long long
using namespace std;
inline int read()
{
int x=0,f=1;
char ch=getchar();
while(!isdigit(ch))
{
if(ch=='-')
f=-1;
ch=getchar();
}
while(isdigit(ch))
x=(x<<1)+(x<<3)+(ch^48),
ch=getchar();
return x*f;
}
inline void write(int n)
{
if(n<0)
n=-n,
putchar('-');
if(n>=10)
write(n/10);
putchar(n%10+'0');
return ;
}
const int N=35,M1=3610,M2=4*M1,INF=0x3f3f3f3f;
int n,m,q;
int head[M1],idx;
int dist1[N][N],dist2[M1];
int g[N][N];
int dx[]={0,0,-1,1};
int dy[]={-1,1,0,0};
bool vis[M1];
struct Edge
{
int nxt,to;
int w;
}edge[M2];
void add_edge(int from,int to,int w)
{
edge[idx].to=to;
edge[idx].w=w;
edge[idx].nxt=head[from];
head[from]=idx++;
return ;
}
int get(int i,int j,int k)
{
return ((i-1)*m+j-1)*4+k;
}
void bfs(int px,int py,int bx,int by,int dir)
{
memset(dist1,0x3f,sizeof dist1);
dist1[px][py]=dist1[bx][by]=0;
queue<pair<int,int> >q;
q.push({px,py});
while(q.size())
{
auto t=q.front();
q.pop();
for(int i=0;i<4;i++)
{
int x=t.first+dx[i],y=t.second+dy[i];
if(g[x][y]&&dist1[x][y]>dist1[t.first][t.second]+1)
{
dist1[x][y]=dist1[t.first][t.second]+1;
q.push({x,y});
}
}
}
if(dir==-1)
return ;
int id=get(bx,by,dir);
for(int i=0;i<4;i++)
if(i!=dir)
{
int x=bx+dx[i],y=by+dy[i];
if(dist1[x][y]<INF)
add_edge(id,get(bx,by,i),dist1[x][y]);
}
add_edge(id,get(px,py,dir^2),1);
return ;
}
int spfa(int sx,int sy,int tx,int ty)
{
queue<int> q;
memset(dist2,0x3f,sizeof dist2);
for(int i=0;i<4;i++)
{
int x=sx+dx[i],y=sy+dy[i];
if(dist1[x][y]<INF)
{
int k=get(sx,sy,i);
dist2[k]=dist1[x][y];
q.push(k);
vis[k]=1;
}
}
while(q.size())
{
auto t=q.front();
q.pop();
vis[t]=0;
// int i=head[t];
// while(~i)
// {
// int j=edge[i].to;
// if(dist2[j]>dist2[t]+edge[i].w)
// {
// dist2[j]=dist2[t]+edge[i].w;
// if(!vis[j])
// {
// q.push(j);
// vis[j]=1;
// }
// }
// i=edge[i].nxt;
// }
for (int i = head[t]; ~i; i = edge[i].nxt)
{
int j = edge[i].to;
if (dist2[j] > dist2[t] + edge[i].w)
{
dist2[j] = dist2[t] + edge[i].w;
if (!vis[j])
{
q.push(j);
vis[j] = 1;
}
}
}
}
int res=INF;
for(int i=0;i<4;i++)
res=min(res,dist2[get(tx,ty,i)]);
if(res==INF)
res=-1;
return res;
}
signed main()
{
n=read(),m=read(),q=read();
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
g[i][j]=read();
memset(head,-1,sizeof head);
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
if(g[i][j])
for(int k=0;k<4;k++)
{
int x=i+dx[k],y=j+dy[k];
if(g[x][y])
bfs(x,y,i,j,k);
}
while(q--)
{
int ex=read(),ey=read(),sx=read(),sy=read(),tx=read(),ty=read();
if(sx==tx&&sy==ty)
{
write(0);
putchar('\n');
continue;
}
bfs(ex,ey,sx,sy,-1);
write(spfa(sx,sy,tx,ty));
putchar('\n');
}
return 0;
}
回复
共 0 条回复,欢迎继续交流。
正在加载回复...