专栏文章

模板库

个人记录参与者 1已保存评论 0

文章操作

快速查看文章及其快照的属性,并进行相关操作。

当前评论
0 条
当前快照
1 份
快照标识符
@miqs0033
此快照首次捕获于
2025/12/04 09:47
3 个月前
此快照最后确认于
2025/12/04 09:47
3 个月前
查看原文

宽搜

最短路径:

一维:

CPP
#include <bits/stdc++.h>
using namespace std;
const int N=1000010;
int n,k;
int q[2*N],hh,tt;
int d[2*N];
void f(int x){
	q[tt++]=x;
	d[x]=0;
	while(hh<tt)
	{
		int p=q[hh++];
		if(p==k) return;
		if(d[p+1]==-1&&p+1<=100000)
		{
			q[tt++]=p+1;
			d[p+1]=d[p]+1;
		}
		if(d[p-1]==-1&&p-1>=0)
		{
			q[tt++]=p-1;
			d[p-1]=d[p]+1;
		}
		if(d[p*2]==-1&&p*2<=100000)
		{
			q[tt++]=p*2;
			d[p*2]=d[p]+1;
		}
	}
}
int main(){
	memset(d,-1,sizeof(d));
	cin>>n>>k;
	f(n);
	cout<<d[k];
    return 0;
}

二维(迷宫问题):

CPP
#include <bits/stdc++.h>
using namespace std;
const int N=1010;
int n,a[N][N],ans=0;
struct L{
	int x,y;
}q[N*N];
int hh,tt;
int d[N][N],dx[]={-1,0,1,0},dy[]={0,-1,0,1};
void f(int w,int m)
{
	q[tt++]={w,m};
	d[w][m]=0;
	while(hh<tt)
	{
		L p=q[hh++];
		if(p.x==n&&p.y==n)
		{
			ans=d[p.x][p.y];
			return;
		}
		for(int i=0;i<4;i++)
		{
			int nx=p.x+dx[i];
			int ny=p.y+dy[i];
			if(nx>=1&&nx<=n&&ny>=1&&ny<=n&&d[nx][ny]==-1&&a[nx][ny]==0)
			{
				q[tt++]={nx,ny};
				d[nx][ny]=d[p.x][p.y]+1;
			}
		}
	}
}
int main(){
	memset(d,-1,sizeof(d));
	cin>>n;
	for(int i=1;i<=n;i++)
		for(int j=1;j<=n;j++)
			cin>>a[i][j];
	f(1,1);
	cout<<ans;
    return 0;
}

评论

0 条评论,欢迎与作者交流。

正在加载评论...