洛谷P1443马的遍历-题解
原题:
思路:
广搜。
但队列除了记忆坐标,还要记忆步数。
在将一个点入队的时候,这个点的步数为这个点的父亲节点的步数+1,顺便把答案设了。
代码:
#include<bits/stdc++.h> using namespace std; int n,m; int sx,sy; int a[405][405]; int book[405][405]; int nxt[8][2]={{-2,1},{-2,-1},{-1,2},{-1,-2},{2,1},{2,-1},{1,2},{1,-2}}; queue<int> qx; queue<int> qy; queue<int> qs; void BFS() { while(!qx.empty()&&!qy.empty()) { for(int i=0;i<8;i++) { int tx=qx.front()+nxt[i][0]; int ty=qy.front()+nxt[i][1]; int ts=qs.front()+1; if(tx<=0||tx>n||ty<=0||ty>m) continue; if(book[tx][ty]==1) continue; a[tx][ty]=ts; book[tx][ty]=1; qx.push(tx); qy.push(ty); qs.push(ts); } qx.pop(); qy.pop(); qs.pop(); } } int main() { scanf("%d %d %d %d",&n,&m,&sx,&sy); qx.push(sx); qy.push(sy); qs.push(0); book[sx][sy]=1; BFS(); for(int i=1;i<=n;i++) { for(int j=1;j<=m;j++) if(book[i][j]) printf("%-5d",a[i][j]); else printf("%-5d",-1); printf("\n"); } return 0; }