哈尔滨理工大学软件与微电子学院第八届程序设计竞赛同步赛(高年级)(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,把棋盘放在第一象限,棋盘的左下角是(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 }
有大佬用记忆化搜索写的,真的tql,学习了学习了,感觉和大佬的差距真的不小,一定要好好加油啊。。
1 #include<iostream>
2 #include<cstring>
3 #include<cstdio>
4 #include<algorithm>
5 #define inf 0x3f3f3f3f
6 using namespace std;
7 const int maxn=2e5+10;
8 typedef long long ll;
9 ll dp[210][210][210];
10 const ll mod=1000000007;
11 int dir[8][2]={{2,1},{1,2},{-1,2},{-2,1},{-2,-1},{-1,-2},{1,-2},{2,-1}};
12 int n,m,t;
13 ll dfs(int x,int y,int step)
14 {
15 if(x==n&&y==m&&step==t)
16 return dp[n][m][step]=1;
17 if(step>=t)
18 return 0;
19 if(dp[x][y][step]!=-1)
20 return dp[x][y][step];
21 ll sum=0;
22 for(int i=0;i<8;i++)
23 {
24 int tx=x+dir[i][0];
25 int ty=y+dir[i][1];
26 if(tx>=1&&tx<=n&&ty>=1&&ty<=m)
27 {
28 sum+=dfs(tx,ty,step+1);
29 // cout<<sum<<endl;
30 sum%=mod;
31 }
32 }
33 return dp[x][y][step]=sum;
34
35 }
36 int main()
37 {
38 while(~scanf("%d%d%d",&n,&m,&t))
39 {
40 memset(dp,-1,sizeof(dp));
41 printf("%lld\n",dfs(1,1,0)%mod);
42 }
43 }