码迷,mamicode.com
首页 > 其他好文 > 详细

【跳马问题】蒟蒻题解

时间:2020-02-03 13:37:45      阅读:57      评论:0      收藏:0      [点我收藏+]

标签:没有   show   clu   int   lin   规律   return   开始   code   

原题:传送门

上来先看(鬼畜的题目背景)题目描述。一看就是一个二维的深搜。

有芥末一条马,只会往右跳(话说它左腿系不系瘸了)日字形。

再一看数据范围,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;
}

附记

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

【跳马问题】蒟蒻题解

标签:没有   show   clu   int   lin   规律   return   开始   code   

原文地址:https://www.cnblogs.com/clear-skies/p/12255281.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!