哈爾濱理工大學軟體與微電子學院第八屆程式設計競賽同步賽(高年級)(F)小樂樂下象棋
阿新 • • 發佈:2018-12-02
小樂樂下象棋
連結: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 }