1 条题解

  • 0
    @ 2026-9-23 0:39:30

    一道广搜的题。

    一开始想的是访问到一个落脚石时枚举所有其他石头判断是否可以落脚。

    但是我们发现这里搜索时每次都要进行一次 O(n)O(n) 的搜索,最终的时间复杂度肯定高。

    如何优化呢?

    容易发现,一个点周围能符合要求的点只有 2424 个。

    这样我们就可以换一个方法标记石头。

    可以开一个二维数组,有石头的地方标为 11,否则标为 00。

    这样每次判断可以到达哪些石头时只要枚举周围几个点即可。

    可是二维数组开不了这么大,于是可以用 map 来储存。

    代码如下:

    #include<bits/stdc++.h>
    #define int long long
    using namespace std;
    struct node{//用结构体储存落脚石的信息
    	int x,y,dep;//dep用来记录步数
    };
    queue<node> q;
    int n,t,ans;
    map<int,map<int,int> > mp,vis;//用map来储存石头的位置
    int solve(){
    	q.push({0,0,0});
    	while(!q.empty()){//广搜
    		int x=q.front().x;
    		int y=q.front().y;
    		int dep=q.front().dep;
    		q.pop();
    		if(y==t) return dep;
    		for(int i=-2;i<=2;i++){
    			for(int j=-2;j<=2;j++){
    				int xi=x+i,yj=y+j;
    				if(mp[xi][yj]&&!vis[xi][yj]){
    					vis[xi][yj]=1;
    					q.push({xi,yj,dep+1});
    				}
    			}
    		}
    	}
    	return -1;//不行就返回-1
    }
    signed main(){
    	cin>>n>>t;
    	for(int i=1;i<=n;i++){
    		int x,y;
    		cin>>x>>y;
    		mp[x][y]=1;
    	}
    	cout<<solve();
    	return 0;
    } 
    
    • 1

    信息

    ID
    2194
    时间
    1000ms
    内存
    128MiB
    难度
    10
    标签
    递交数
    2
    已通过
    2
    上传者