题干:

小乐乐一天天就知道玩,这一天又想玩象棋。
我们都知道马走日。
现在给定一个棋盘,大小是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

解题报告:

跪了一晚上发现是因为写成了ty=x+ny[k]了,,,看来是太久不写地图的dfs了、、老毛病又犯了、、难受难受

AC代码1:(记忆化搜索)

其实也可以直接在main函数中dp[n][m][0]=1,这样在写dfs的时候就不需要特判一下出口了、、总的来说是个不算难的好题、、

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<queue>
#include<map>
#include<vector>
#include<set>
#include<string>
#include<cmath>
#include<cstring>
#define ll long long
#define pb push_back
#define pm make_pair
#define fi first
#define se second
using namespace std;
const int MAX = 2e5 + 5;
ll dp[205][205][205];
const ll mod = 1000000007;
int n,m,t;
int nx[9] = {-2,-1,1,2,2,1,-1,-2};
int ny[9] = {1,2,2,1,-1,-2,-2,-1};
bool ok(int x,int y) {if(x>=1&&x<=n&&y>=1&&y<=m) return 1;else return 0;
}
ll dfs(int x,int y,int res) {if(x == n && y == m && res == 0) return dp[n][m][res]=1;if(res <= 0) return 0;if(dp[x][y][res]!=-1) return dp[x][y][res];ll sum = 0;int tx,ty;for(int k = 0; k<8; k++) {tx = x + nx[k];ty = y + ny[k];if(ok(tx,ty) == 0) continue;//if(res==0) continue;sum += dfs(tx,ty,res-1);sum %= mod;}dp[x][y][res] = sum;return sum;}
int main()
{while(~scanf("%d%d%d",&n,&m,&t)) {memset(dp,-1,sizeof dp);printf("%lld\n",dfs(1,1,t)%mod);}    return 0 ;}

其中也有一个细节值得注意,,这样搜索的正确性,,首先因为你表示的状态,体现出了剩余的步数,所以不用怕走过去下一步又走回来这种情况,,因为在状态设计中这属于不同的状态,,所以没事,,再就是不用怕会出现环,,也就是绕一圈状态又绕回来了。。原因就是因为你的dfs都是res-1的操作,所以整个就是一个DAG图,不必要担心会出现未完成值的重复调用。。

AC代码2:(三种直接dp)

#include<bits/stdc++.h>
using namespace std;
#define LL long long
#define pii pair<int,int>
#define x first
#define y second
#define mp make_pair
//#define debug
const LL mod=1e9+7;
LL f[205][205][205];
int fx[8][2]={1,2,1,-2,2,1,2,-1,-1,-2,-1,2,-2,-1,-2,1};
void B(){int n,m,K;while(cin>>n>>m>>K){memset(f,0,sizeof(f));f[1][1][0]=1;for(int k=0;k<=K;++k){for(int i=1;i<=n;++i){for(int j=1;j<=m;++j){if(f[i][j][k]){for(int o=0;o<8;++o){if(i+fx[o][0]>=1 && j+fx[o][1]>=1)(f[i+fx[o][0]][j+fx[o][1]][k+1]+=f[i][j][k])%=mod; }}}}}cout<<f[n][m][K]<<endl;}
}
int main(){B();return 0;
}#include<bits/stdc++.h>
#define mod 1000000007
using namespace std;
int dp[205][205][205];
int dis[8][2]={2,1,2,-1,-2,1,-2,-1,1,2,1,-2,-1,2,-1,-2};
int main()
{int n,m,k;while(scanf("%d%d%d",&n,&m,&k)!=EOF){memset(dp,0,sizeof(dp));dp[1][1][0]=1;for(int s=1;s<=k;s++)for(int i=1;i<=n;i++)for(int j=1;j<=m;j++){int temp=0;for(int h=0;h<8;h++){int x=i+dis[h][0];int y=j+dis[h][1];if(x>=1&&x<=n&&y>=1&&y<=m)temp+=dp[x][y][s-1],temp%=mod;}dp[i][j][s]=temp;}printf("%d\n",dp[n][m][k]);
}return 0;
}#include <bits/stdc++.h>
using namespace std;
int dp[205][205][205];
const int mod=1000000007;
int nex[8][2]={{1,2},{2,1},{-1,-2},{-2,-1},{2,-1},{1,-2},{-1,2},{-2,1}};
int main()
{int n,m,d;while(~scanf("%d %d %d",&n,&m,&d)){memset(dp,0,sizeof(dp));dp[1][1][0]=1;for(int k=1;k<=d;k++){for(int i=1;i<=n;i++)for(int j=1;j<=m;j++){for(int s=0;s<8;s++){int x=i+nex[s][0];int y=j+nex[s][1];if(x<1||y<1||x>n||y>m) continue;dp[i][j][k]=(dp[i][j][k]+dp[x][y][k-1])%mod;}}}printf("%d\n",dp[n][m][d]);}return 0;
}

看了dp的代码发现dp好像也不是很难写、、、也不是很难想,,因为这种状态也是符合递推的。。

简单的一个题,,着实又让我对动态规划有了新的理解!!!!

考虑改编:

改编成一个n*m的方格,但是终点不是右上角的那个[n,m]点,而是新输入的两个点,,这样进行dp,,但是可能有个问题就是可能搜索的范围会大了很多啊。。

【牛客 - 301哈尔滨理工大学软件与微电子学院第八届程序设计竞赛同步赛(高年级)】小乐乐下象棋(记忆化搜索dp,dfs)相关推荐

  1. 【牛客 - 301哈尔滨理工大学软件与微电子学院第八届程序设计竞赛同步赛(高年级 )】小乐乐和25(模拟,技巧)

    题干: 小乐乐特别喜欢25这个数字,他想把所有的数字都变成25的倍数. 现在小乐乐得到一个数字,想问问你最少用几次操作才可以把这个数字改造成25的倍数. 对于一次操作我们可以把相邻的两位做交换,比如1 ...

  2. 【牛客 - 301哈尔滨理工大学软件与微电子学院第八届程序设计竞赛同步赛(高年级)】小乐乐搭积木(状压dp)

    题干: 小乐乐想要给自己搭建一个积木城堡. 积木城堡我们假设为n*m的平面矩形. 小乐乐现在手里有1*2,2*1两种地砖. 小乐乐想知道自己有多少种组合方案. 输入描述: 第一行输入整数n,m.(1& ...

  3. *【牛客 - 301哈尔滨理工大学软件与微电子学院第八届程序设计竞赛同步赛(高年级)】小乐乐打游戏(bfs,双元bfs,思维)

    题干: 小乐乐觉得学习太简单了,剩下那么多的时间好无聊,于是便想打游戏.         最近新出了一个特别火的游戏,叫吃猪,小乐乐准备玩一玩.         吃猪游戏很简单,给定一个地图,大小为n ...

  4. 【牛客 - 301哈尔滨理工大学软件与微电子学院第八届程序设计竞赛同步赛(高年级)】小乐乐的组合数+(取模,数学,思维)

    题干: 小乐乐得知一周有7天之后就对7产生了兴趣. 小乐乐得到了两堆数字数字时连续的. 第一堆包含[1,n]n个数字,第二堆包含[1,m]m个数字. 小乐乐想要从两堆中各挑选出一个整数x,y,使得x, ...

  5. 【牛客 - 302哈尔滨理工大学软件与微电子学院第八届程序设计竞赛同步赛(低年级)】小乐乐切割方块(思维,水题)

    题干: 小乐乐的作业本是2n*2n的方格本. 某天小乐乐的童鞋,想要考验一下小乐乐. 他将小乐乐的一张方格纸中的某个格子(x,y)涂成黑色, 小乐乐能否在将4*4的方格本沿着方格边缘且切割线与黑色方格 ...

  6. 【牛客 - 302哈尔滨理工大学软件与微电子学院第八届程序设计竞赛同步赛(低年级)】小乐乐吃糖豆 (fIb博弈)

    题干: 小乐乐是一个比较喜欢吃糖豆的小孩子,小乐乐的哥哥大乐乐也同样爱吃糖豆. 作为一个小孩子,他们永远觉得谁吃掉了最后一个糖豆,谁吃的糖豆最多. 为了公平起见小乐乐与大乐乐商量吃糖豆的规则如下: 1 ...

  7. 【牛客 - 302哈尔滨理工大学软件与微电子学院第八届程序设计竞赛同步赛(低年级)】 小乐乐算数字(水题,快速幂,lowbit)

    题干: 小乐乐最喜欢玩数字了. 小乐乐最近迷上了2这个整数,他觉得2的幂是一种非常可爱的数字. 小乐乐想知道整数x的最大的 2的幂 (2^y)的因子. y为整数. 输入描述: 输入整数x.(1< ...

  8. 哈尔滨理工大学软件与微电子学院第八届程序设计竞赛同步赛(高年级)题解(全)

    链接:https://ac.nowcoder.com/acm/contest/301#question 来源:牛客网 比较难的有 目录(很难的,比较难的) A小乐乐的组合数+              ...

  9. 哈尔滨理工大学软件与微电子学院第八届程序设计竞赛同步赛(高年级) 小乐乐的组合数+

    题目: 链接:https://ac.nowcoder.com/acm/contest/301/A 来源:牛客网 题目描述 小乐乐得知一周有7天之后就对7产生了兴趣. 小乐乐得到了两堆数字数字时连续的. ...

最新文章

  1. 【转载】PHP报错分析(Corrupted encoded data detected in)
  2. python下载文件到指定目录-Python获取指定文件夹下的文件名的方法
  3. spring之java配置(springboot推荐的配置方式)
  4. 用WEB技术栈开发NATIVE应用:WEEX SDK原理详解
  5. 电磁波传播相位是否会变化_电磁波相位关系释疑
  6. linux redis 数据迁移,redis cluster 迁移数据
  7. Android开发中的全屏背景显示方案
  8. 1.Docker技术入门与实战 --- 初识Docker与容器
  9. ubuntu下格式化U盘
  10. 服务器新建虚拟机不识别u盘,虚拟机无法识别u盘如何解决_虚拟机中无法识别u盘的处理办法...
  11. Java设计模式:1.1.认识六个原则(开闭,里氏替代,依赖颠倒)
  12. 【RAC】如何让Oracle RAC crs_stat 命令显示完整
  13. html表格填充空白单元格,快速填充空白单元格【应对步骤】
  14. 天猫出海!12亿国货“一店卖全球”
  15. php zend optimizer 解密,PHP反编译工具(Mr.DeZend GUI)下载 v1.0
  16. 区块链网发布区块链百科的步骤
  17. MLOps极致细节:18. Azure ML Pipeline(机器学习管道),Azure Container Instances (ACI)部署模型
  18. 初识micro:bit
  19. shell KeyValue文件值的替换和获取(sed)
  20. 一份鲜为人知的Python特性

热门文章

  1. 深度学习02——Softmax、DNN、WideDeep Model
  2. python判断英文字母_python判断字符串中是否含有英文 | 个人学习笔记记录
  3. 简易贪吃蛇c语言贴吧,熬书几个月,终于编出简易的贪吃蛇了,VS2013
  4. armv8 汇编 绝对地址赋值_详解汇编语言B和LDR指令与相对跳转和绝对跳转的关系...
  5. 微博air客户端_打磨近十年,接近「完美」的 macOS 第三方微博客户端:Maipo
  6. python opencv输出mp4_Python玩转视频处理(四):视频按场景进行分割
  7. DM3730 LCD控制器驱动框架
  8. Linux内核的Softirq机制
  9. win7连接sftp_SFTP远程连接服务器上传下载文件-vs2013项目实例
  10. python从小白到大牛pdf 下载 资源共享_Kotlin从小白到大牛 (关东升著) 中文pdf高清版[12MB]...