一道简单的bfs搜索题,bfs最早搜到终点的那条路径一定是最短的路径,输出步数即可,然后就是搜过的点没有必要再搜了,既然曾经被走过,那么再重复走这点的路径肯定不是最短路,再次重新走也是多余。
#include<bits/stdc++.h>
using namespace std;
int x,y;
struct node{
int x,y;
node(int a,int b){
x=a; y=b;
}
node(){
}
};
bool check(int xx,int yy,int tx,int ty){
double ans=sqrt((xx-tx)*(xx-tx)+(yy-ty)*(yy-ty));
int p=ans;
if(ans-p==0){
return true;
}
return false;
}
int step[60][60];
int vis[60][60];
void bfs(int xx,int yy){
queue<node> q;
vis[xx][yy]=1;
q.push(node(xx,yy));
while(!q.empty()){
node tmp=q.front();
if(tmp.x==x&&tmp.y==y){
cout<<step[tmp.x][tmp.y]<<endl;
return;
}
q.pop();
for(int i=tmp.x;i<=x;i++){
for(int j=tmp.y;j<=y;j++){
if(check(i,j,tmp.x,tmp.y)&&!vis[i][j]){
vis[i][j]=1;
step[i][j]=step[tmp.x][tmp.y]+1;
q.push(node(i,j));
}
}
}
}
}
int main(){
int t;
cin>>t;
while(t--){
memset(step,0,sizeof(step));
memset(vis,0,sizeof(vis));
cin>>x>>y;
bfs(0,0);
}
}