跳马问题蒟蒻题解
Posted clear-skies
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了跳马问题蒟蒻题解相关的知识,希望对你有一定的参考价值。
原题:传送门
上来先看(鬼畜的题目背景)题目描述。一看就是一个二维的深搜。
有芥末一条马,只会往右跳(话说它左腿系不系瘸了)日字形。
再一看数据范围,n,m<=18
。等等,半棋盘不是只有4行6列吗?算了,跟(OI)讲什么道理啊。
好了,闲话完毕,步入正题。
#include<iostream>
using namespace std;
为了用坐标模拟马向右跳的动作,就要写一个坐标变化表。
int dx[4]={2,-2,1,-1},dy[4]={1,1,2,2};//模拟坐标x,y的变化规律,四个情况对应四个走法
int sum,m,n;
[敲显示屏]下面是深搜的灵魂,DFS函数。注意看好!!!
void dfs(int x,int y)//坐标X,Y
{
if(x==n&&y==m)//当到达右上角(m,n)时,退出深搜
{
sum++;
return;
}
else //否则模拟各种方向
for(int i=0;i<=3;i++)
{
int tx=x+dx[i];
int ty=y+dy[i];
if(tx>=0&&tx<=n&&ty>=0&&ty<=m)//当没有超出边界时
dfs(tx,ty);//继续DFS
}
}
主程序
int main()
{
cin>>n>>m;
dfs(0,0);//从(0,0)位置开始寻找
cout<<sum;
return 0;
}
完美源码奉上:
#include<iostream>
using namespace std;
int dx[4]={2,-2,1,-1},dy[4]={1,1,2,2};
int sum,m,n;
void dfs(int x,int y)
{
if(x==n&&y==m)
{
sum++;
return;
}
else
for(int i=0;i<=3;i++)
{
int tx=x+dx[i];
int ty=y+dy[i];
if(tx>=0&&tx<=n&&ty>=0&&ty<=m)
dfs(tx,ty);
}
}
int main()
{
cin>>n>>m;
dfs(0,0);
cout<<sum;
return 0;
}
附记
题目中的坐标有个很坑的地方,就是与初中数学的平面直角坐标系相冲突的先行后列思想,写程序时记得别搞混哈。
以上是关于跳马问题蒟蒻题解的主要内容,如果未能解决你的问题,请参考以下文章