P1443 马的遍历
题目描述
有一个n*m的棋盘(1<n,m<=400),在某个点上有一个马,要求你计算出马到达棋盘上任意一个点最少要走几步
输入输出格式
输入格式:
一行四个数据,棋盘的大小和马的坐标
输出格式:
一个n*m的矩阵,代表马到达某个点最少要走几步(左对齐,宽5格,不能到达则输出-1)
输入输出样例
输入样例#1: 复制
3 3 1 1
输出样例#1: 复制
0 3 2
3 -1 1
2 1 4
和上个题一样,上题看懂了,这题套用就好了。
不要再顽固地执着于dfs了。。
BFS代码:
#include<iostream> #include<cstdio> #include<cmath> #include<algorithm> #include<cstring> #include<queue> using namespace std; int n,m,a1,b1; int dis[405][405]; int xx[]= {2,2,1,-1,-2,-2,-1,1}; int yy[]= {1,-1,-2,-2,-1,1,2,2}; struct node { int x,y; }a,b; queue<node> q; void bfs(int x,int y) { a.x =x,a.y =y; q.push(a); dis[x][y]=0; while(!q.empty()) { b=q.front(); q.pop(); x=b.x ,y=b.y ; for(int i=0; i<8; ++i) { int dx=x+xx[i]; int dy=y+yy[i]; if(dx<1||dy<1||dx>n||dy>m||dis[dx][dy]+1) continue; dis[dx][dy]=dis[x][y]+1; b.x =dx,b.y =dy; q.push(b); } } } int main() { memset(dis,-1,sizeof(dis)); scanf("%d%d%d%d",&n,&m,&a1,&b1); bfs(a1,b1); for(int i=1;i<=n;++i) { for(int j=1;j<=m;++j) printf("%-5d",dis[i][j]); printf("\n"); } return 0; }
如果你不开心,那我就把右边这个帅傻子分享给你吧,
你看,他这么好看,那么深情的望着你,你还伤心吗?
真的!这照片盯上他五秒钟就想笑了。
一切都会过去的。