【跳馬問題】蒟蒻題解

原題:傳送門

上來先看(鬼畜的題目背景)題目描述。一看就是一個二維的深搜。

有芥末一條馬,只會往右跳(話說它左腿系不繫瘸了)日字形。

再一看數據範圍,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;
}

附記

題目中的座標有個很坑的地方,就是與初中數學的平面直角座標系相沖突的先行後列思想,寫程序時記得別搞混哈。

相關文章
相關標籤/搜索