洛谷 P1443 马的遍历 BFS
P1443 马的遍历
题目描述
有一个n*m的棋盘(1<n,m<=400),在某个点上有一个马,要求你计算出马到达棋盘上任意一个点最少要走几步
输入格式
一行四个数据,棋盘的大小和马的坐标
输出格式
一个n*m的矩阵,代表马到达某个点最少要走几步(左对齐,宽5格,不能到达则输出-1)
输入输出样例
输入 #1
3 3 1 1
输出 #1
BFS
0 3 2 3 -1 1 2 1 4
--------------------------------------------------------------------------------------------------------
1 #include<stdio.h> 2 #include<string.h> 3 int n,m,sx,sy,map[410][410],h[3][233333],ti[233333],u[9]={0,-2,-1,1,2,2,1,-1,-2},w[9]={0,1,2,2,1,-1,-2,-2,-1},p=-1; 4 bool tap[410][410]; 5 int search(); 6 int main(){ 7 scanf("%d %d %d %d",&n,&m,&sx,&sy); 8 search(); 9 for(int i=1;i<=n;i++){ 10 for(int j=1;j<=m;j++) 11 if(!tap[i][j]) printf("%-5d",p); 12 else printf("%-5d",map[i][j]); 13 printf("\n"); 14 } 15 return 0; 16 } 17 int search(){ 18 memset(map,0,sizeof(map)); 19 memset(tap,0,sizeof(tap)); 20 memset(ti,0,sizeof(ti)); 21 memset(h,0,sizeof(h)); 22 int head=0,tail=1,x,y; 23 h[1][tail]=sx;h[2][tail]=sy;tap[sx][sy]=1; 24 do{ 25 head++; 26 for(int i=1;i<=8;i++){ 27 x=h[1][head]+u[i]; 28 y=h[2][head]+w[i]; 29 if(x>0&&y>0&&x<=n&&y<=m&&(!tap[x][y])){ 30 //printf("te:%d %d %d %d\n",x,y,i,head); 31 tap[x][y]=1; 32 tail++; 33 h[1][tail]=x; 34 h[2][tail]=y; 35 ti[tail]=ti[head]+1; 36 map[x][y]=ti[tail]; 37 } 38 } 39 }while(head<tail); 40 }