小明逛公园

问题理解

input:
N(节点个数) M(道路条数)
N1 N2 M1
...
N1m N2m Mm
计划个数
计划起点1 计划终点1
计划起点2 计划终点2
...
output:
计划1最短路
计划2最短路

代码实现

#include <iostream>
#include<vector>
using namespace std;
int main(){
    int m,n,p1,p2,val;
    vector<vector<int>> grid(n+1,vector<int>(n+1,10005));
    cin>>n>>m;
    while(m--){
        cin>>p1>>p2>>val;
        grid[p1][p2]=val;
        grid[p2][p1]=val;
    }
    for(int k=1;k<=n;k++){
        for(int i=1;i<=n;i++){
            for(int j=1;j<=n;j++){
                grid[i][j]=min(grid[i][k] + grid[k][j],grid[i][j]);
            }
        }
    } 
    int z,start,end;
    cin>>z;
    while(z--){
        cin>>start>>end;
    if(grid[start][end]==10005) cout<<-1<<endl;
    else cout<<grid[start][end]<<endl;
    }
}

骑士的行进路线

骑士在棋盘中以特定的规则前进,从起始位置到达终点位置需要走的最少步数。

#include<iostream>
#include<queue>
#include<string.h>
using namespace std;
int moves[1001][1001];
int dir[8][2]={-2,-1,-2,1,-1,2,1,2,2,1,2,-1,1,-2,-1,-2};
void bfs(int a1,int a2,int b1,int b2){
    queue<int> q;
    q.push(a1);
    q.push(a2);
    while(!q.empty()){
        int m=q.front();q.pop();
        int n=q.front();q.pop();
        if(m==b1&&n==b2)
        break;
        for(int i=0;i<8;i++){
            int mm=m+dir[i][0];
            int nn=n+dir[i][1];
            if(mm<1||mm>1000||nn<1||nn>1000)
            continue;
            if(!moves[mm][nn]){
                moves[mm][nn]=moves[m][n]+1;
                q.push(mm);
                q.push(nn);
            }
        }
       }
}
int main(){
    int n,a1,a2,b1,b2;
    cin>>n;
    while(n--){
        cin>>a1>>a2>>b1>>b2;
        memset(moves,0,sizeof(moves));
        bfs(a1,a2,b1,b2);
        cout<<moves[b1][b2]<<endl;
    }
    return 0;
}
posted on 2026-01-13 17:59  FAfa_C++  阅读(2)  评论(0)    收藏  举报