1. 马的遍历

题目链接(码学堂)

题目链接(洛谷)

分析:典型最短路径

从(X,Y)压入队列,第一次到达的必是最短的,进行标记不回溯

 

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<queue>
 4 #include<cstring>
 5 #include<string>
 6 using namespace std;
 7 int n,m;
 8 int ans[405][405];
 9 queue<int> p,q;
10 int X;int Y;
11 int dx[10]={1,-1,1,-1,2,2,-2,-2};
12 int dy[10]={2,2,-2,-2,-1,1,-1,1};
13 bool vis[405][405]; 
14 void BFS(int x,int y,int step)
15 {
16     while(!p.empty()&&!q.empty())
17     {
18         int nowx=p.front(),nowy=q.front();
19         for(int i=0;i<=7;i++)
20         {
21             int xx=nowx+dx[i],yy=nowy+dy[i];//注意全局传参和局部更新的参数 
22             if(xx<=0||xx>n||yy<=0||yy>m||vis[xx][yy]==1) continue;//边界判断 
23             p.push(xx);
24             q.push(yy);
25             vis[xx][yy]=1;
26             ans[xx][yy]=ans[nowx][nowy]+1;
27         }
28         p.pop();q.pop();//位置重要吗 
29 //        if(p.front()!=nowx) step++; //step条件
30         if(p.front()==n&&q.front() ==m)    return;
31     }
32 }
33 
34 int main()
35 {
36     memset(ans,-1,sizeof(ans));
37     cin>>n>>m>>X>>Y;
38     ans[X][Y]=0;
39     vis[X][Y]=1;
40     
41     p.push(X);
42     q.push(Y);
43     
44     BFS(X,Y,1);
45     for(int i=1;i<=n;i++)
46     {
47         for(int j=1;j<=m;j++)
48             printf("%-5d",ans[i][j]);
49         cout<<endl;
50     }
51     return 0;
52 }

如代码所示

注意:

1.step传参传错,队列先进先出一对多,有多个元素是同一step

因此要通过他们上级司令来判断他们的step

2. p.pop();q.pop();的位置到底重要吗??

posted @ 2022-08-24 14:39  要不要吃哈密瓜  阅读(24)  评论(0编辑  收藏  举报