洛谷 P1443 马的遍历
作者:互联网
题目:马的遍历
网址:https://www.luogu.com.cn/problem/P1443
题目描述
有一个n*m的棋盘(1<n,m<=400),在某个点上有一个马,要求你计算出马到达棋盘上任意一个点最少要走几步?
输入格式
一行四个数据,棋盘的大小和马的坐标
输出格式
一个n*m的矩阵,代表马到达某个点最少要走几步(左对齐,宽5格,不能到达则输出-1)
输入输出样例
输入
3 3 1 1
输出
0 3 2
3 -1 1
2 1 4
Flood-fill 标准题目。需要判重。
代码如下:
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
#include<queue>
#define MAX_size 400 + 10
using namespace std;
const int dx[8] = {-2 , -1 , 1 , 2 , 2 , 1 , -1 , -2};
const int dy[8] = {1 , 2 , 2 , 1 , -1 , -2 , -2 , -1};
struct pos
{
int x , y;
} st;
int n , m , d[MAX_size][MAX_size];
bool valid(int x , int y)
{
if(x < 1 || x > n || y < 1 || y > m) return false;
if(d[x][y] != -1) return false;
return true;
}
void bfs()
{
queue <pos> Q;
while(!Q.empty()) Q.pop();
d[st.x][st.y] = 0;
Q.push(st);
while(!Q.empty())
{
pos now = Q.front();
Q.pop();
for(int i = 0; i < 8; ++ i)
{
int x = now.x + dx[i] , y = now.y + dy[i];
if(valid(x , y))
{
pos next = (pos) {x , y};
d[x][y] = d[now.x][now.y] + 1;
Q.push(next);
}
}
}
}
int main()
{
scanf("%d %d %d %d" , &n , &m , &st.x , &st.y);
memset(d , -1 , sizeof(d));
bfs();
for(int i = 1; i <= n; ++ i)
{
for(int j = 1; j <= m; ++ j) printf("%-5d" , d[i][j]);
puts("");
}
return 0;
}
标签:遍历,洛谷,P1443,int,pos,st,include,now,size 来源: https://www.cnblogs.com/zach20040914/p/12814355.html