马的遍历 洛谷 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 }

 

posted @ 2017-03-13 01:04  circlegg  阅读(420)  评论(0编辑  收藏  举报