马的疑惑
今天在洛谷上看到这道题,想起了夕阳下的棋盘。于是我尝试去做了做,二话不说看题。
一扇穿越到洛谷的门:
思考:
如图,是我们象棋中马的走位走的方向。
首先看到这道题,我们要确定马能跳的方位,我们设马的坐标为(x,x)。很容易知道马可以跳到(x+1)(y+2),(x+2)(y+1),(x+2)(y-1),(x+1)(y-2),(x-1)(y-2),
(x-2)(y-1),(x-2)(y+1),(x-1)(y+2).总共八个搜索方向。由于是最短路径问题,所以自然容易想到宽搜(BFS)然而,由于你们亲爱的博主太LJ以至于他连宽搜的
不会。博主成功自闭。。。好的,经过一番思想斗争。我决定要学好宽搜用深搜来做。也就是八个if,没什么大不了。
然后前提是马跳的位置不能超出棋盘,还有如果已经有了最优解就没必要在搜了。
代码:
#include<iostream> #include<cstdio> #include<cstring> using namespace std; int n,m,madex,madey,a[601][601]; void dfs(int,int,int); int main() { cin>>n>>m>>madex>>madey; memset(a,-1,sizeof(a)); dfs(madex,madey,0); for(int i=1;i<=n;i++) { for(int j=1;j<=m;j++) printf("%-5d",a[i][j]); printf("\n"); } return 0; } void dfs(int x,int y,int step) { a[x][y]=step; if(y+1<=m&&x+2<=n&&(a[x+2][y+1]==-1||a[x+2][y+1]>step)) dfs(x+2,y+1,step+1); if(y-1>0&&x+2<=n&&(a[x+2][y-1]==-1||a[x+2][y-1]>step)) dfs(x+2,y-1,step+1); if(y+1<=m&&x-2>=0&&(a[x-2][y+1]==-1||a[x-2][y+1]>step)) dfs(x-2,y+1,step+1); if(x-2>0&&y-1>0&&(a[x-2][y-1]==-1||a[x-2][y-1]>step)) dfs(x-2,y-1,step+1); if(x+1<=n&&y-2>0&&(a[x+1][y-2]==-1||a[x+1][y-2]>step)) dfs(x+1,y-2,step+1); if(x+1<=n&&y+2<=m&&(a[x+1][y+2]==-1||a[x+1][y+2]>step)) dfs(x+1,y+2,step+1); if(x-1>0&&y-2>0&&(a[x-1][y-2]==-1||a[x-1][y-2]>step) ) dfs(x-1,y-2,step+1); if(x-1>0&&y+2<=m&&(a[x-1][y+2]==-1||a[x-1][y+2]>step)) dfs(x-1,y+2,step+1); }
然后这道题就成功被我玩坏了,哈哈哈
上洛谷一看三个AC,七个TLE。我的内心是崩溃的。呜呜呜!
好了,我太蒟蒻了,各位大佬们取用宽搜吧!
宽搜真的很重要!
众生,与我如浮云