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();的位置到底重要吗??