题目来源:洛谷
题目描述
爱与愁大神坐在公交车上无聊,于是玩起了手机。一款奇怪的游戏进入了爱与愁大神的眼帘:***(游戏名被打上了马赛克)。这个游戏类似象棋,但是只有黑白马各一匹,在点x1,y1和x2,y2上。它们得从点x1,y1和x2,y2走到1,1。这个游戏与普通象棋不同的地方是:马可以走“日”,也可以像象走“田”。现在爱与愁大神想知道两匹马到1,1的最少步数,你能帮他解决这个问题么?
输入格式
第1行:两个整数x1,y1
第2行:两个整数x2,y2
输出格式
第1行:黑马到1,1的距离
第2行:白马到1,1的距离
输入输出样例
输入 #1
12 16
18 10
输出 #1
8
9
数据范围
100%数据:x1,y1,x2,y2<=20
思路:
大家好我是深搜党
看到数据范围萌生了**的想法
那就来个记忆化搜索吧!
code:
#include<bits/stdc++.h>
using namespace std;
int x,y,f[30][30];
//f[i][j]:从i,j走到1,1所需的最小步数
int dx[13]={0,-2,-2,+2,+2,-1,-1,+1,+1,-2,-2,+2,+2};
int dy[13]={0,-1,+1,-1,+1,-2,+2,-2,+2,-2,+2,-2,+2};
//马字8个方向,田字4个方向
void dfs(int x,int y,int step) //记忆化搜索,走到x,y花了step步
{
f[x][y]=step; //更新最小步数
for (int i=1;i<=12;i++) //12个方向走一遍
{
int xx=x+dx[i];
int yy=y+dy[i];
if (xx>=1&&xx<=20&&yy>=1&&yy<=20&&(f[xx][yy]==0||f[xx][yy]>step+1)) dfs(xx,yy,step+1);
//如果没超出边界并且xx,yy可以被更新,就继续走
}
}
int main()
{
for (int i=1;i<=2;i++)
{
scanf("%d%d",&x,&y);
memset(f,0,sizeof(f));
dfs(x,y,0); //走到x,y需要0步
printf("%d\n",f[1][1]); //最后输出
}
return 0;
}
我爱深搜,我爱深搜,我爱深搜!
等我哪天遇到非BFS不可的题目了我再写BFS(•‾̑⌣‾̑•)✧˖°