分析:
本题要求的是到每个点的最短步数,最短这一类的题用宽度搜索算法bfs。
因为马可以再八个方向上移动,所以我们的move数组也要做相应的改变。
最后要注意用-5%d输出,本题问题就不大了。
#include<stdio.h>
//#define min(a,b) a<b?a:b
struct point
{
int x;
int y;
};
int n,m;
int map[500][500];
int book[500][500];
int move[8][2] = {{-2,-1},{-2,1},{-1,2},{1,2},{2,1},{2,-1},{1,-2},{-1,-2}};
void dfs(struct point now)
{
//printf("now.x=%d now.y=%d \n",now.x,now.y);
for(int i=0;i<8;i++)
{
struct point next;
next.x=now.x+move[i][0];
next.y=now.y+move[i][1];
if(next.x<0||next.y<0||next.x>=n||next.y>=m) continue;
if(book[next.x][next.y]) continue;
book[next.x][next.y]=1;
if(map[next.x][next.y]==-1) map[next.x][next.y]=map[now.x][now.y]+1;
dfs(next);
book[next.x][next.y]=0;
}
return ;
}
int end;
struct point queue[10000000];
void bfs(int now)
{
while(now<end)
{
// printf("x=%d y=%d\n",queue[now].x,queue[now].y);
for(int i=0;i<8;i++)
{
struct point next;
next.x=queue[now].x+move[i][0];
next.y=queue[now].y+move[i][1];
if(next.x<0||next.y<0||next.x>=n||next.y>=m) continue;
if(book[next.x][next.y]) continue;
book[next.x][next.y]=1;
map[next.x][next.y]=map[queue[now].x][queue[now].y]+1;
queue[end++]=next;
}
++now;
}
}
main()
{
struct point now;
scanf("%d%d%d%d",&n,&m,&now.x,&now.y);
for(int i=0;i<=n;i++)
{
for(int j=0;j<=m;j++)
{
map[i][j]=-1;
}
}
now.x--;
now.y--;
book[now.x][now.y]=1;
map[now.x][now.y]=0;
//dfs(now);
end=1;
queue[0]=now;
bfs(0);
for(int i=0;i<n;i++)
{
for(int j=0;j<m;j++)
{
printf("%-5d",map[i][j]);
}
printf("\n");
}
// printf("\n\n");
// for(int i=0;i<end;i++)
// {
// printf("i=%d x=%d y=%d\n",i,queue[i].x,queue[i].y);
// }
}