bfs解决洛谷P1443 马的遍历

马的遍历

题目链接

题目描述

有一个n*m的棋盘(1

输入格式
一行四个数据,棋盘的大小和马的坐标

输出格式
一个n*m的矩阵,代表马到达某个点最少要走几步(左对齐,宽5格,不能到达则输出-1)

样例输入
3 3 1 1
样例输出
0 3 2
3 -1 1
2 1 4

解题思路

首先要知道的是马走"日"字,如图,可以从中心圆的位置到达五角星的位置。
bfs解决洛谷P1443 马的遍历_第1张图片
那我们就可以遍历八个方向,所到达的点是否是满足条件的(是否在图内,是否已经走过),每走一步,步数加一,就可以直接把当前的步数给到二维数组a(存储结果的数组)。

代码如下

#include
using namespace std;

int a[405][405];
bool vis[405][405];
int dir[8][2] = {{2,1},{2,-1},{-2,1},{-2,-1},{1,2},{1,-2},{-1,2},{-1,-2}};
int n,m;
int x,y;

struct node {
	int x,y;
	int step;
};
void bfs() {
	queue<node>q;
	node start;
	start.x = x;
	start.y = y;
	start.step = 0;
	vis[x][y] = true;
	a[x][y] = 0;
	q.push(start);	
	while(!q.empty()) {	
		node front = q.front();
		q.pop();
		for(int i = 0; i< 8; i++) {
			int r = front.x + dir[i][0];
			int c = front.y + dir[i][1];
//			printf("r = %d,c = %d\n",r,c);
			if(r>=1 && r<= n && c>=1 && c<= m && !vis[r][c]){	
				node now = front;
				now.x = r;
				now.y = c; 
				now.step++;
				a[r][c] = now.step;
				vis[r][c] = true;
				q.push(now);
			}
		}	
	} 
	return;
} 
int main() {
	scanf("%d%d%d%d",&n,&m,&x,&y);
	for(int i = 1; i<= n; i++) {
		for(int j = 1; j<= m; j++)
			a[i][j] = -1;
	} 
	memset(vis,false,sizeof(vis));
	bfs();
	for (int i = 1;i<= n; i++){
        for (int j = 1;j<= m; j++)
            printf("%-5d",a[i][j]);//注意场宽 我在这被卡了两次= =
        printf("\n");
    }
} 

你可能感兴趣的:(算法,bfs)