洛谷 P1443 马的遍历
2016-11-08 22:11
253 查看
题目描述
有一个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 代碼實現:
#include<cstdio> #include<iostream> using namespace std; int n,m,qh,ql,h,l,s,nh,nl,ns,head,tail; int map[600][600],dl[300000][3]; int hb[]={-2,-1,1,2,2,1,-1,-2}; int lb[]={1,2,2,1,-1,-2,-2,-1}; bool v[600][600]; int main(){ scanf("%d%d%d%d",&n,&m,&qh,&ql); dl[head][1]=qh;dl[head][2]=ql; dl[head++][0]=0;v[qh][ql]=0; while(head>tail){ h=dl[tail][1];l=dl[tail][2];s=dl[tail++][0];v[qh][ql]=1; for(int i=0;i<8;i++){ nh=h+hb[i];nl=l+lb[i];ns=s+1; if(!v[nh][nl]&&nh>=1&&nh<=n&&nl>=1&&nl<=m){ v[nh][nl]=1; dl[head][1]=nh;dl[head][2]=nl;map[nh][nl]=dl[head++][0]=ns; } } } for(int i=1;i<=n;i++){ for(int j=1;j<=m;j++){ if(v[i][j]) printf("%-5d",map[i][j]); else printf("%-5d",-1); } printf("\n"); } return 0; }
View Code
經典題目馬走日改編,好吧,很水。
相关文章推荐