社区讨论

求调玄关

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 条回复,欢迎继续交流。

正在加载回复...