1. 程式人生 > >哈爾濱理工大學軟體與微電子學院第八屆程式設計競賽同步賽(高年級)(F)小樂樂下象棋

哈爾濱理工大學軟體與微電子學院第八屆程式設計競賽同步賽(高年級)(F)小樂樂下象棋

小樂樂下象棋

連結:https://ac.nowcoder.com/acm/contest/301/F
來源:牛客網

題目描述

小樂樂一天天就知道玩,這一天又想玩象棋。
我們都知道馬走日。
現在給定一個棋盤,大小是n*m,把棋盤放在第一象限,棋盤的左下角是(0,0),右上角是(n - 1, m - 1);
小樂樂想知道,一個馬從左下角(0, 0)開始,走了k步之後,剛好走到右上角(n - 1, m - 1)的方案數。

輸入描述:

輸入:多組樣例輸入,每組一行,三個整數n, m, k(1 <= n, m, k <= 200),如題目所示。

輸出描述:

輸出:輸出答案 mod 1000000007
示例1

輸入

4 4 2

輸出

2
題解:emmmm...可以說是一個很經典的dp or 暴搜了 為啥還是不會做呢。。太菜了太菜了
 1 #include<iostream>
 2 #include<cstdio>
 3 #include<queue>
 4 #include<cstring>
 5 #include<algorithm>
 6
#define inf 0x3f3f3f3f 7 const int mod = 1e9+7; 8 using namespace std; 9 int n,m,k; 10 int dir[8][2]={{2,1},{1,2},{-1,2},{-2,1},{-2,-1},{-1,-2},{1,-2},{2,-1}}; 11 int dp[210][210][210]; 12 int main() 13 { 14 while(~scanf("%d%d%d",&n,&m,&k)) 15 { 16 memset(dp,0,sizeof(dp));
17 dp[0][0][0]=1; 18 for(int t=1;t<=k;t++) 19 { 20 for(int i=0;i<=n-1;i++) 21 { 22 for(int j=0;j<=m-1;j++) 23 { 24 if(i+2>=0&&j+1>=0&&i+2<n&&j+1<m) 25 dp[i][j][t]=(dp[i][j][t]+dp[i+2][j+1][t-1])%mod; 26 if(i+1>=0&&j+2>=0&&i+1<n&&j+2<m) 27 dp[i][j][t]=(dp[i][j][t]+dp[i+1][j+2][t-1])%mod; 28 if(i-1>=0&&j+2>=0&&i-1<n&&j+2<m) 29 dp[i][j][t]=(dp[i][j][t]+dp[i-1][j+2][t-1])%mod; 30 if(i-2>=0&&j+1>=0&&i-2<n&&j+1<m) 31 dp[i][j][t]=(dp[i][j][t]+dp[i-2][j+1][t-1])%mod; 32 if(i-2>=0&&j-1>=0&&i-2<n&&j-1<m) 33 dp[i][j][t]=(dp[i][j][t]+dp[i-2][j-1][t-1])%mod; 34 if(i+1>=0&&j-2>=0&&i+1<n&&j-2<m) 35 dp[i][j][t]=(dp[i][j][t]+dp[i+1][j-2][t-1])%mod; 36 if(i+2>=0&&j-1>=0&&i+2<n&&j-1<m) 37 dp[i][j][t]=(dp[i][j][t]+dp[i+2][j-1][t-1])%mod; 38 if(i-1>=0&&j-2>=0&&i-1<n&&j-2<m) 39 dp[i][j][t]=(dp[i][j][t]+dp[i-1][j-2][t-1])%mod; 40 } 41 } 42 } 43 printf("%d\n",dp[n-1][m-1][k]); 44 } 45 }