今天上午有事去了。下午上来做了一个题目。差不多说直接上题目和代码吧。
P1443 马的遍历
# 马的遍历
## 题目描述
有一个 $n \times m$ 的棋盘,在某个点 $(x, y)$ 上有一个马,要求你计算出马到达棋盘上任意一个点最少要走几步。
## 输入格式
输入只有一行四个整数,分别为 $n, m, x, y$。
## 输出格式
一个 $n \times m$ 的矩阵,代表马到达某个点最少要走几步(不能到达则输出 $-1$)。
## 样例 #1
### 样例输入 #1
```
3 3 1 1
```
### 样例输出 #1
```
0 3 2
3 -1 1
2 1 4
```
## 提示
### 数据规模与约定
对于全部的测试点,保证 $1 \leq x \leq n \leq 400$,$1 \leq y \leq m \leq 400$。
代码
#include<bits/stdc++.h>
using namespace std;
struct point{
int x,y;
};
int main()
{
int n,m,x0,y0,a[402][402],dx[8]={-1,-2,-2,-1,1,2,2,1},dy[8]={-2,-1,1,2,2,1,-1,-2};
queue<point> mazou;
cin>>n>>m>>x0>>y0;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
a[i][j]=-1;
}
}
a[x0][y0]=0;
point tp={x0,y0},p;
mazou.push(tp);
while(!mazou.empty()){
tp=mazou.front() ;
mazou.pop();
for(int i=0;i<8;i++){
int x=dx[i]+tp.x,y=dy[i]+tp.y;
if(x<1||x>n||y<1||y>m||a[x][y]!=-1)continue;
a[x][y]=a[tp.x][tp.y]+1;
p={x,y};
mazou.push(p);
}
}
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
cout<<a[i][j]<<" ";
}
cout<<endl;
}
return 0;
}
在这个题目中我学到了如何定义一个以列queue<类型>名称。总的来说呢,今天还是有收获的。每天进步一点点吧,加油!