这里附上题目链接:马的遍历。
~~手动分割~~
题目
解法
1.BFS
AC代码:
#include <stdio.h>
#include <stdlib.h>
int n,m;//棋盘有n行m列
int board[401][401],visit[401][401];//board为棋盘,visit用于标记棋格是否被访问
int location[8][2]={{1,2},{2,1},{1,-2},{2,-1},{-1,2},{-1,-2},{-2,1},{-2,-1}};//8个方位
struct box
{
int x,y;//行列坐标
int step;//step表示从马的出发点走到该格的步数
}queue[200000];
int check(int x,int y)
{
if(x<1||x>n||y<1||y>m)//若坐标越界
{
return 0;
}
return 1;
}
int BFS(int horse_x,int horse_y)
{
int x,y;
int i,head=0,tail=0;//定义队首、队尾
queue[tail].x=horse_x;
queue[tail].y=horse_y;
queue[tail].step=1;
visit[horse_x][horse_y]=1;//将马初始时所在的棋格标记为已访问
board[horse_x][horse_y]+=queue[head].step;
tail++;
while(head<tail)
{
for(i=0;i<8;i++)
{
x=queue[head].x+location[i][0];
y=queue[head].y+location[i][1];
if(check(x,y))//若坐标未越界
{
if(visit[x][y])//若棋格已访问
{
continue;
}
visit[x][y]=1;//将当前棋格标记为已访问
//新结点入队
queue[tail].x=x;
queue[tail].y=y;
queue[tail].step=queue[head].step+1;
board[x][y]+=queue[tail].step;
tail++;
}
}
head++;
}
return 0;
}
int main()
{
int i,j,horse_x,horse_y;
//输入数据
scanf("%d%d%d%d",&n,&m,&horse_x,&horse_y);
for(i=1;i<=n;i++)
{
for(j=1;j<=m;j++)
{
board[i][j]=-1;
}
}
//广搜
BFS(horse_x,horse_y);
//输出结果
for(i=1;i<=n;i++)
{
for(j=1;j<=m;j++)
{
printf("%-5d",board[i][j]);
}
printf("\n");
}
return 0;
}