题目传送门
题目大概是这样的 ,给你一个棋盘的地图,然后再给你一个点的坐标,然后告诉你一组坐标,然后让你求一只马从这组坐标开始到任意一个格子的最短距离
看到这种什么求最短路径的,当然用广度优先搜索啊!
科普一下,什么时候用dfs什么时候用bfs:
求最短的距离,一般是用广搜:
求方案总数,一般是用深搜。
然后这题就简单了 ,唯一的注意就是:
你直接一条广搜,从题目给的坐标开始,用一个二维数组,把搜到的每一个点的距离存进去。
就完了。
---------------------------------------------------------以下是代码---------------------------------------------------------
#includeusing namespace std; int flag[401][401]={0}; int dx[8]={1,2,1,2,-1,-2,-1,-2}; int dy[8]={2,1,-2,-1,2,1,-2,-1}; int que[160801][4]; int ans[401][401]; int n,m,x,y; int judge(int i,int j) { if(i<1||j<1)return 0; if(i>n||j>m)return 0; if(flag[i][j])return 0; return 1; } int bfs() { int h=1,t=1; que[1][1]=x; que[1][2]=y; que[1][3]=0; flag[x][y]=1; ans[x][y]=0; while(h<=t) { for(int i=0;i<8;i++) { int tx=que[h][1]+dx[i]; int ty=que[h][2]+dy[i]; if(judge(tx,ty)) { t++; que[t][1]=tx; que[t][2]=ty; que[t][3]=que[h][3]+1; ans[tx][ty]=que[t][3]; flag[tx][ty]=1; } } h++; } } int main() { cin>>n>>m>>x>>y; bfs(); for(int i=1;i<=n;i++) { for(int j=1;j<=m;j++) { if(ans[i][j]==0&&!(i==x&&j==y))ans[i][j]=-1; printf("%-5d",ans[i][j]); } cout< 然后大功告成了。点个赞叭。



