POJ数字滑雪问题
来源:互联网 发布:眉间雪道姑捏脸数据 编辑:程序博客网 时间:2024/05/16 05:23
数字滑雪问题实际上是递归(动态规划)的典型问题,和走迷宫或者网络爬虫搜索策略类似。将二维数组转化为一个树的遍历算法(广度优先或者深度优先,也称作队列优先或者堆栈优先)。下面是源码,代码的核心在于此时状态到下一状态需要利用状态转移方程来获取。而问题难点在于如何利用规则设计出状态方程。然后利用递归求解(因为每个结点的遍历方式都一样)
<span style="font-size:14px;">#include <stdio.h>#define MAX 100int skiMap[MAX][MAX]; //地图存储int skiLength[MAX][MAX];//滑行最长距离存储int direction[4][2]= {{1,0},{0,1},{-1,0},{0,-1}}; //四个方向的坐标变化 //判断当前要访问节点(x,y)是否在地图内bool isInSkiMap(int x, int y, int N){ if (x >= 0 && x < N && y >= 0 && y < N) { return true; } else { return false; }}int DepthFirstSearch(int x, int y, int N){ if (skiLength[x][y] > 1) { return skiLength[x][y];//要是该点已经处理过了,取值不是初值,直接返回该点的值即可 } int maxLen = 1; //对四个可能能滑行的方向分别搜索 for (int i = 0; i < 4; i++) { int nextX = x + direction[i][0]; int nextY = y + direction[i][1]; if (isInSkiMap(nextX, nextY, N) //该点在地图内,该点值比上一点的值小 && skiMap[nextX][nextY] < skiMap[x][y]) { //上一点的最大滑行距离=max{四个方向相邻点的最大滑行距离}+1 skiLength[x][y] = DepthFirstSearch(nextX, nextY, N) + 1; if (skiLength[x][y] > maxLen) { maxLen = skiLength[x][y]; } } } skiLength[x][y] = maxLen;//记录最大值,便于下次使用 return maxLen;}int ski(const int *arr, int N){ if ( arr == NULL || N <= 0) { return -1; } for (int i = 0; i < N; i++) for (int j = 0; j < N; j++) { skiLength[i][j] = 1;//所有点的滑行最长长度初始化为1,只有自身 skiMap[i][j] = arr[N * i + j]; } int longest = DepthFirstSearch(0, 0, N); //从skimap[0][0]开始搜索 return (longest > 1)? longest:1;}int main(void){ int a[] = {24,23,22,21,20,13,14,17,18,19,12,15,16,1,0,11,8,7,4,3,10,9,6,5,2}; printf("%d\n", ski(a, 5)); return 0;}</span>
0 0
- POJ数字滑雪问题
- poj 1088 滑雪问题
- poj 1088 滑雪问题
- poj 1088 滑雪问题
- 数字滑雪
- POJ 1088 滑雪问题 动态规划
- POJ DP 百练1088 滑雪问题
- nyoj10 poj 1088经典滑雪问题
- POJ 滑雪
- poj 滑雪
- 滑雪 POJ
- 滑雪 POJ
- 滑雪 POJ
- 滑雪 POJ
- 滑雪 POJ
- 滑雪问题
- 滑雪问题
- 滑雪问题
- ACM题集以及各种总结大全!
- VS2010将标准输出信息输出到output中
- ubuntu14.04 无线网卡安装
- lua中将表转成json格式的字符串
- 柏拉图《会饮篇》
- POJ数字滑雪问题
- find_first_of
- Java中字段和属性的区别
- 【JAVA】Java学习路线图
- vagrant up启动,不用选择桥接网络接口的方法
- 第一篇博客,MARK下
- Android 数据查询query函数参数解析
- Java反射原理分析
- Oracle笔记.一.简单查询、限制性查询和数据的排序