您的位置:首页 > 其它

洛谷 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
經典題目馬走日改編,好吧,很水。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: