题目描述
有一个 n×m 的棋盘,在某个点 (x,y) 上有一个马,要求你计算出马到达棋盘上任意一个点最少要走几步。
输入格式
输入只有一行四个整数,分别为 n,m,x,y。
输出格式
一个 n×m 的矩阵,代表马到达某个点最少要走几步(不能到达则输出 −1)。
输入输出样例
输入 #1复制
3 3 1 1
输出 #1复制
0 3 2 3 -1 1 2 1 4
说明/提示
数据规模与约定
对于全部的测试点,保证 1≤x≤n≤400,1≤y≤m≤400。
#include<bits/stdc++.h>
using namespace std;
int n,m,x2,y2;
char a[405][405];
int visited[405][405];
int next1[8][2]={{2,1},{1,2},{-1,2},{-1,-2},{2,-1},{1,-2},{-2,1},{-2,-1}};
struct node{
int x;
int y;
};
queue<node>q;
bool check(int x,int y)
{
if(a[x][y]=='1')
{
return false;
}
if(x<1||x>n)
{
return false;
}
if(y<1||y>m)
{
return false;
}
if(visited[x][y]>0)
{
return false;
}
return true;
}
void bfs(int x,int y)
{
visited[x][y]=1;
q.push((node){x,y});
while(q.size())
{
int t1=q.front().x;
int t2=q.front().y;
q.pop();
for(int i=0;i<8;i++)
{
int xx=t1+next1[i][0];
int yy=t2+next1[i][1];
if(check(xx,yy))
{
visited[xx][yy]=visited[t1][t2]+1;
q.push((node){xx,yy});
}
}
}
}
int main ()
{
scanf("%d%d%d%d",&n,&m,&x2,&y2);
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
a[i][j]='0';
}
}
bfs(x2,y2);
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
cout<<visited[i][j]-1<<" ";
}
cout<<endl;
}
return 0;
}
//by crtzk7