首先来看一下题目描述:
题目描述
有一个n*m的棋盘(1<n,m<=400),在某个点上有一个马,要求你计算出马到达棋盘上任意一个点最少要走几步
输入输出格式
输入格式:
一行四个数据,棋盘的大小和马的坐标
输出格式:
一个n*m的矩阵,代表马到达某个点最少要走几步(左对齐,宽5格,不能到达则输出-1)
输入输出样例
输入样例#1:
3 3 1 1
输出样例#1:
0 3 2 3 -1 1 2 1 4 好了很明显了这是一道搜索题。那么再来分析一下:是应该用深搜还是用广搜呢?那么再来回头看一下题目:要求输出最少的步数。这时我们就应该考虑深搜的可行性了:深搜是一次跑到底,不撞南墙不回头,那么只要搜寻到一个结果都会进行跳出,这种答案是随机的,那么在这里我们使用广搜。 首先来讲一下思路:考虑到马走日的行走规律,我们先定下一个dx和dy数组,用来储存方向。
]={,,,-,-,,-,,-}; ]={,,,-,-,-,,-,};
然后是常规的一系列操作:定义地图map,进行搜索。
然后就是搜索函数search。函数的参数为x和y和ans,这里我们定义的返回时刻是一个阙值(定值),可以设定在150~200左右,因为到了这个阙值,地图必将遍历完成(由于数据范围大小的原因)。
然后就是搜索了,我们在函数里面定义一个参数ans用来记录最小步数,然后每次把map[x][y]=ans,这里的x,y是表示的当前的位置坐标,然后在不出界,map未走过的情况下,朝8个方向搜索,代码如下了:
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #include<string> #include<cmath> using namespace std; ]={,,,-,-,,-,,-}; ]={,,,-,-,-,,-,}; int n,m,horsex,horsey; ][]; void search(int x,int y,int ans) { ) return ; map[x][y]=ans; ;i<=;i++) { &&y+dy[i]>) if(x+dx[i]<=n&&y+dy[i]<=m) ||map[x+dx[i]][y+dy[i]]>ans+) search(x+dx[i],y+dy[i],ans+); } } int main() { cin>>n>>m>>horsex>>horsey; ;i<=n;i++) ;j<=m;j++) map[i][j]=-; search(horsex,horsey,); ;i<=n;i++) { ;j<=m;j++) printf("%-5d",map[i][j]); printf("\n"); } ; }