跳马问题蒟蒻题解

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;
}

附记

题目中的坐标有个很坑的地方,就是与初中数学的平面直角坐标系相冲突的先行后列思想,写程序时记得别搞混哈。

以上是关于跳马问题蒟蒻题解的主要内容,如果未能解决你的问题,请参考以下文章

code vs 1216 跳马问题

USACO 简易题解(蒟蒻的题解)

铺地毯蒟蒻题解

[SHOI2013] 超级跳马

BZOJ4417: [Shoi2013]超级跳马

bzoj4417 [Shoi2013]超级跳马