马的遍历 洛谷 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
一道比较明显的广度优先搜索题,可以发现,起始点值为0,当马第一次跳到哪个点时就是哪个点应该标记的值,并且后续跳到同一个点后会重复循环,一定不是最优解,所以只需保留每个点的第一次遍历到的状态即可,如果发现当前遍历到的点已经被遍历过了,就跳过此点,继续扩展,知道没有可以扩展的点,即所有可能的点都已被遍历过,而遍历不到的点只需在开始时将矩阵初始化为-1就可以保证正确了。
但是题中还有一个条件,就是输出“左对齐,宽5格”,两个条件都可以用printf搞定,只需在“%”与“d”间加上“-5”即可,“-”代表左对齐,“5”代表输出宽5格,还有一个小技巧就是可以再“5”前加“0”,这样可以补足5位前导0,但是注意与“-”左对齐共同使用并无卵用
上代码:
1 #include<cstdio>
2 #include<iostream>
3 using namespace std;
4 int n,m,sy,sx,head,tail,ty,tx;
5 int map[401][401];
6 struct que{
7 int y,x,step;
8 }q[160001];
9 int main(){
10 scanf("%d%d%d%d",&n,&m,&sy,&sx);
11 for(int i=1;i<=n;i++){//先初始化为-1
12 for(int j=1;j<=m;j++){
13 map[i][j]=-1;
14 }
15 }
16 head=tail=1;
17 map[sy][sx]=0;
18 q[tail].y=sy;
19 q[tail].x=sx;
20 q[tail++].step=0;
21 while(head<tail){
22 ty=q[head].y;
23 tx=q[head].x;
24 if(map[ty-2][tx+1]==-1){//向马能跳到的八个方向遍历
25 //-1判断是否仍未遍历过,保证是第一次遍历
26 q[tail].y=ty-2;
27 q[tail].x=tx+1;
28 q[tail].step=q[head].step+1;
29 map[ty-2][tx+1]=q[tail].step;
30 tail++;
31 }
32 if(map[ty-1][tx+2]==-1){
33 q[tail].y=ty-1;
34 q[tail].x=tx+2;
35 q[tail].step=q[head].step+1;
36 map[ty-1][tx+2]=q[tail].step;
37 tail++;
38 }
39 if(map[ty+1][tx+2]==-1){
40 q[tail].y=ty+1;
41 q[tail].x=tx+2;
42 q[tail].step=q[head].step+1;
43 map[ty+1][tx+2]=q[tail].step;
44 tail++;
45 }
46 if(map[ty+2][tx+1]==-1){
47 q[tail].y=ty+2;
48 q[tail].x=tx+1;
49 q[tail].step=q[head].step+1;
50 map[ty+2][tx+1]=q[tail].step;
51 tail++;
52 }
53 if(map[ty+2][tx-1]==-1){
54 q[tail].y=ty+2;
55 q[tail].x=tx-1;
56 q[tail].step=q[head].step+1;
57 map[ty+2][tx-1]=q[tail].step;
58 tail++;
59 }
60 if(map[ty+1][tx-2]==-1){
61 q[tail].y=ty+1;
62 q[tail].x=tx-2;
63 q[tail].step=q[head].step+1;
64 map[ty+1][tx-2]=q[tail].step;
65 tail++;
66 }
67 if(map[ty-1][tx-2]==-1){
68 q[tail].y=ty-1;
69 q[tail].x=tx-2;
70 q[tail].step=q[head].step+1;
71 map[ty-1][tx-2]=q[tail].step;
72 tail++;
73 }
74 if(map[ty-2][tx-1]==-1){
75 q[tail].y=ty-2;
76 q[tail].x=tx-1;
77 q[tail].step=q[head].step+1;
78 map[ty-2][tx-1]=q[tail].step;
79 tail++;
80 }
81 head++;
82 }
83 for(int i=1;i<=n;i++,puts("")){
84 for(int j=1;j<=m;j++){
85 printf("%-5d",map[i][j]);//左对齐 宽5格
86 }
87 }
88 return 0;
89 }