小明逛公园
问题理解
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;
}
浙公网安备 33010602011771号