1. 程式人生 > >codevs1219 騎士遊歷 【記憶化搜尋】【黃金】

codevs1219 騎士遊歷 【記憶化搜尋】【黃金】

題目描述 Description

設有一個n*m的棋盤(2≤n≤50,2≤m≤50),如下圖,在棋盤上有一箇中國象棋馬。

規定:

1)馬只能走日字

2)馬只能向右跳

問給定起點x1,y1和終點x2,y2,求出馬從x1,y1出發到x2,y2的合法路徑條數。

輸入描述 Input Description

第一行2個整數n和m

第二行4個整數x1,y1,x2,y2

輸出描述 Output Description

輸出方案數

樣例輸入 Sample Input

30 30

1 15 3 15

樣例輸出 Sample Output

2

資料範圍及提示 Data Size & Hint

2<=n,m<=50

注:找了好久才發現自己在宣告方向陣列的時候寫錯了,多寫了括號。。。注意二維陣列的宣告方法。

注意這道題要用long long。

#include <iostream>
#include <cstring>
using namespace std;
/////////ac
int n,m;
int a,b,c,d;
int p[4][2]={1,2,2,1,1,-2,2,-1};
long long f[52][52];
long long dfs(int x,int y)
{
	if(x>c||x<1||y>m||y<1)
	{
		return 0;
	}
	if (f[x][y] != 0) //搜尋過 
	{
		return f[x][y];
	}
	for(int i=0;i<4;i++)
	{
		f[x][y]+=dfs(x+p[i][0],y+p[i][1]);
	}
	return f[x][y];
}
int main()
{
	cin>>n>>m;
	cin>>a>>b>>c>>d;
    memset(f, 0, sizeof(f));
	f[c][d]=1;
	cout<<dfs(a,b)<<endl;
	return 0;
}