上來先看(鬼畜的題目背景)題目描述。一看就是一個二維的深搜。
有芥末一條馬,只會往右跳(話說它左腿系不繫瘸了)日字形。
再一看數據範圍,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;
}
附記
題目中的座標有個很坑的地方,就是與初中數學的平面直角座標系相沖突的先行後列思想,寫程序時記得別搞混哈。