当前位置:首页 > 其他 > 正文内容

P1979 [NOIP2013 进步组] 华容道

邻居的猫1个月前 (12-09)其他933

标题粗心

具体标题传送门

\(n\times m\) 的华容道盘,有妨碍。多组问询,每组妨碍不变。其间要将初始在 \((sx,sy)\) 的棋子移动到 \((tx,ty)\)。初始空白的方位在 \((ex,ey)\)。求至少多少次移动完结方针,无法完结输出 -1

\(n,m\leq30,q\leq 500\)

思路

发现明显应该是要预处理什么东西然后关于每组问询再做。然后发现其实这个游戏便是用空格铺路让棋子依照合法的最短间隔一步一步走。

手玩一下能够发现先依照最短间隔将空格移动到初始方位之后就能够开端移动了。发现假如要移动一个棋子到一个方向就需要在不移动原棋子的情况下移动空格。

之后就能够写一个移动的函数了,用宽搜 \(f(cx,cy,sx,sy,ex,ey)\) 表明空格一开端在 \((sx,sy)\),在不经过 \((cx,cy)\) 时移动到 \((ex,ey)\) 的最短步数。

可是假如咱们预处理出一切的 \(f\) 就能够以它为边权跑最短路就能够了。可是发现预处理的时刻复杂度是 \(O(n^8)\) 的,无法承受。

观察到其实每一次的移动除了一开端移动空格到起点四周外只会在四个方向动。所以经过跑 \(f()\) 来算新的 \(v(x,y,a,b)\),其间 \(a,b\in[0,4)\) 表明四个方向。这样咱们能够经过 \(T(16n^4)\) 的办法求助这个棋盘移动恣意一个方位的步数。

发现关于每一组问询跑最短路即可。可是关于状况我设置的与一般最短路略有不同,设了 \(d(x,y,a),a\in[0,4)\) 表明现在在 \((x,y)\),空格在 \((x,y)\)\(a\) 方向时的最短步数即可。

代码

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll MAXN=30+5;
const ll MAXQ=500+5;
ll n,m,Q;
bool gd[MAXN][MAXN];
ll dx[]={0,0,1,-1},dy[]={1,-1,0,0};
bool cg(ll x,ll y){
	return x>0&&x<=n&&y>0&&y<=m&&gd[x][y];
}
bool vis[MAXN][MAXN];
struct node{
	ll x,y,tm;
};
ll bfs(ll cx,ll cy,ll sx,ll sy,ll ex,ll ey){
	queue<node>q;
	memset(vis,false,sizeof(vis));
	q.push({sx,sy,0});
	vis[sx][sy]=true;
	if(sx==cx&&sy==cy){
		return 1e9;
	}
	while(!q.empty()){
		ll x=q.front().x,y=q.front().y,tm=q.front().tm;
		q.pop();
		if(x==ex&&y==ey){
			return tm;
		}
		for(int i=0;i<4;++i){
			ll u=x+dx[i],v=y+dy[i];
			if(cg(u,v)&&!vis[u][v]&&!(u==cx&&v==cy)){
				vis[u][v]=true;
				q.push({u,v,tm+1});
			}
		}
	}
	return 1e9;
}
ll val[MAXN][MAXN][4][4];
struct State{
	ll qx,qy,lst,tm;
	bool operator<(const State&K)const{
        if(tm==K.tm){
            if(qx==K.qx){
                if(qy==K.qy){
                    return lst<K.lst;
                }
                return qy<K.qy;
            }
            return qx<K.qx;
        }
		return tm>K.tm;
	}
};
bool vs[MAXN][MAXN][4];
ll dis[MAXN][MAXN][4];
void dijkstra(ll ex,ll ey,ll sx,ll sy,ll tx,ll ty){
	priority_queue<State>pq;
	memset(vs,false,sizeof(vs));
	memset(dis,0x3f,sizeof(dis));
	for(int i=0;i<4;++i){
		ll u=sx+dx[i],v=sy+dy[i];
		if(!cg(u,v)){
			continue;
		}
		ll w=bfs(sx,sy,ex,ey,u,v);
		if(w>=1e8){
			continue;
		}
		pq.push({sx,sy,i,w});
		dis[sx][sy][i]=w;
	}
	while(!pq.empty()){
		State sta=pq.top();
		pq.pop();
		ll x=sta.qx,y=sta.qy,lst=sta.lst;
		if(vs[x][y][lst]){
			continue;
		}
		vs[x][y][lst]=true;
		for(int i=0;i<4;++i){
			ll u=x+dx[i],v=y+dy[i];
			ll w=val[x][y][lst][i];
			if(w>1e8){
				continue;
			}
			ll nlst;
			if(i==0){
				nlst=1;
			}else if(i==1){
				nlst=0;
			}else if(i==2){
				nlst=3;
			}else{
				nlst=2;
			}
			if(dis[x][y][lst]+w+1<dis[u][v][nlst]){
				dis[u][v][nlst]=dis[x][y][lst]+w+1;
				pq.push({u,v,nlst,dis[u][v][nlst]});
			}
		}
	}
}
int main(){
	ios::sync_with_stdio(false);
	cin.tie(0);cout.tie(0);
	cin>>n>>m>>Q;
	for(int i=1;i<=n;++i){
		for(int j=1;j<=m;++j){
			cin>>gd[i][j];
		}
	}
	memset(val,0x3f,sizeof(val));
	for(int i=1;i<=n;++i){
		for(int j=1;j<=m;++j){
			if(!cg(i,j)){
				continue;
			}
			for(int k=0;k<4;++k){
				ll x=i+dx[k],y=j+dy[k];
				if(!cg(x,y)){
					continue;
				}
				for(int l=0;l<4;++l){
					if(k==l){
						val[i][j][k][l]=0;
						continue;
					}
					ll u=i+dx[l],v=j+dy[l];
					if(!cg(u,v)){
						continue;
					}
					val[i][j][k][l]=bfs(i,j,x,y,u,v);
				}
			}
		}
	}
	while(Q--){
		ll ex,ey,sx,sy,tx,ty;
		cin>>ex>>ey>>sx>>sy>>tx>>ty;
		if(sx==tx&&sy==ty){
			cout<<0<<endl;
			continue;
		}
		if(!cg(sx,sy)||!cg(tx,ty)){
			cout<<-1<<endl;
			continue;
		}
		dijkstra(ex,ey,sx,sy,tx,ty);
        ll ans=min({dis[tx][ty][0],dis[tx][ty][1],dis[tx][ty][2],dis[tx][ty][3]});
		if(ans>1e8){
			cout<<-1<<endl;
		}else{
			cout<<ans<<endl;
		}
	};
	return 0;
}

扫描二维码推送至手机访问。

版权声明:本文由51Blog发布,如需转载请注明出处。

本文链接:https://www.51blog.vip/?id=754

分享给朋友:

“P1979 [NOIP2013 进步组] 华容道” 的相关文章

助力海外,空壳支撑Google Play使用兼顾

助力海外,空壳支撑Google Play使用兼顾

空壳 V2.2 ,支撑从 Google Play 下载的使用兼顾! 出海的你或许需求一起办理多个交际或作业账号。空壳 为你供给完美的多账号解决方案,让你能够多账号一起在线,无需来回切换,操作快捷高效。无论是个人日子,仍是事务拓宽,都能称心如意。 空壳 支撑 Google Play 官方使用的兼顾...

IPD项目办理流程怎么优化?这些软件帮你搞定!

IPD项目办理流程怎么优化?这些软件帮你搞定!

IPD(Integrated Product Development,集成产品开发)项目办理流程着重跨部分协作、产品生命周期办理和高效的信息流转。在这样的项目办理形式下,不只要和谐产品设计、研制、制作等部分的作业,还要保证在产品生命周期的各个阶段,信息和资源可以高效、无缝地活动。 要优化IPD项目办...

2024年11月总结及漫笔之献血和球赛安检

2024年11月总结及漫笔之献血和球赛安检

1. 回头看 日更坚持了700天。 读《数据工程之道:规划和构建强健的数据体系》更新完结 读《数据质量管理:数据可靠性与数据质量问题解决之道》开更并继续更新 2023年至2024年11月底累计码字1738120字,累计日均码字2483字。 2024年11月码字95323字,同比上升38.38%,环...

SDL3 入门(5):纹路烘托

SDL3 入门(5):纹路烘托

创立纹路 有三个 API 能够用来创立纹路: SDL_CreateTexture 参数少,运用便利,适用于创立简略的纹路 SDL_CreateTextureFromSurface 适用于从已有图画数据创立纹路 SDL_CreateTextureWithProperties 能够指定各种特色,功用强壮...

开源节流 造句

开源节流 造句

开源节流是一个成语,意思是开发财源,节省开支。下面是几个使用“开源节流”造句的例子:1. 政府应该采取措施开源节流,以减轻财政负担。2. 企业要想持续发展,必须注重开源节流,提高经济效益。3. 在经济困难时期,个人也应该学会开源节流,合理规划收支。4. 通过开源节流,我们可以为环保事业贡献一份力量。...

中国区块链公司排名,行业领军者盘点

中国区块链公司排名,行业领军者盘点

1. 2023中国产业区块链企业100强: 榜单基于2022年度全年相关数据统计分析与核查比对得出,涵盖了行业影响力、创新与可持续发展、技术服务能力、产业应用能力等四个一级指标,以及19个细化统计指标。 排名前列的企业包括:蚂蚁区块链、腾讯云、招商局集团、国家电网、中国移动、中国工商银行...