Tyvj 1004
问题描述: 输入一个 r*c 的矩阵,并且矩阵中的每个元素都是
正整数,从其中某个大的元素出发,向4个方向(上下左右)
递归,直到划出一条能够通过较多数字的线,并且满足数字
从大到小。
解决方案: 其实,我们可以人为的把我们输入的每一个元素所对应
的数值当做是一座座的山峰,正如题目要求的那样,滑雪
然后尽可能从高处的山峰往低处的山峰滑行,第一次做的
时候,没看懂样例,琢磨了一段时间后,突然明白了,题目
的含义,实际上就是按照一定的路线,从最大的元素向最小的
元素走,然后记录所走的步数即可,样例很特殊,25步走出来
后,刚好构成了蛇形阵。
第一步,一一枚举每个点,看他是不是能作为我们开始滑行
的起点。
第二步,找到这个点后,向4个方向DFS,即可。
第三步,找到的那个最大的起点,就是我们的最大路线
代码: (1)在代码中,学会了一种解决搜索问题的常用方法,那就是设置
一个dis [][],数组,当我们向4个方向,也就是通常所说的
上下左右进行搜索时,我们就定义这样一个数组:
dis[4][2] = {{1,0},{0,1},{-1,0},{0,-1}};
其实很简单,,大家脑补下就行。。。。
如果所涉及的问题稍微有些复杂的话,向8个方向进行搜索
那么我们定义这样一个数组:
dis[8][2] = {{-1,-1},{-1,0},{-1,1},{0,-1},{0,1}
,{1,-1},{1,0},{1,1}};
思路和方法类似,就是又多了4个对角线上的方向而已~
(2)并且在搜索问题中,我们还要设置一个vis[][]数组,这个
数组的大小和处理问题时所开的数组一定是等大的。
并且一开始用memset对vis数组进行初始化,可以初始化为
0或者-1,,其他的数值都不行的。
贴上模板~~
当做模板记住它~
其实在很多情况下,如果实在看不出那些大牛们的代码。
可以手模下,,虽然浪费时间,但是很容易就能理解了,
我就是这么手模过来的~~~
问题描述: 输入一个 r*c 的矩阵,并且矩阵中的每个元素都是
正整数,从其中某个大的元素出发,向4个方向(上下左右)
递归,直到划出一条能够通过较多数字的线,并且满足数字
从大到小。
解决方案: 其实,我们可以人为的把我们输入的每一个元素所对应
的数值当做是一座座的山峰,正如题目要求的那样,滑雪
然后尽可能从高处的山峰往低处的山峰滑行,第一次做的
时候,没看懂样例,琢磨了一段时间后,突然明白了,题目
的含义,实际上就是按照一定的路线,从最大的元素向最小的
元素走,然后记录所走的步数即可,样例很特殊,25步走出来
后,刚好构成了蛇形阵。
第一步,一一枚举每个点,看他是不是能作为我们开始滑行
的起点。
第二步,找到这个点后,向4个方向DFS,即可。
第三步,找到的那个最大的起点,就是我们的最大路线
代码: (1)在代码中,学会了一种解决搜索问题的常用方法,那就是设置
一个dis [][],数组,当我们向4个方向,也就是通常所说的
上下左右进行搜索时,我们就定义这样一个数组:
dis[4][2] = {{1,0},{0,1},{-1,0},{0,-1}};
其实很简单,,大家脑补下就行。。。。
如果所涉及的问题稍微有些复杂的话,向8个方向进行搜索
那么我们定义这样一个数组:
dis[8][2] = {{-1,-1},{-1,0},{-1,1},{0,-1},{0,1}
,{1,-1},{1,0},{1,1}};
思路和方法类似,就是又多了4个对角线上的方向而已~
(2)并且在搜索问题中,我们还要设置一个vis[][]数组,这个
数组的大小和处理问题时所开的数组一定是等大的。
并且一开始用memset对vis数组进行初始化,可以初始化为
0或者-1,,其他的数值都不行的。
贴上模板~~
int nx, ny;
for ( int i = 0;i < 4;i++ )
{
nx = x + dis[i][0];
ny = y + dis[i][1];
if ( 0 <= nx&&nx < r&&0 <= ny&&ny < c&&a[x][y] > a[nx][ny] )
{
t = max( search( nx, ny ),t );
}
}
当做模板记住它~
其实在很多情况下,如果实在看不出那些大牛们的代码。
可以手模下,,虽然浪费时间,但是很容易就能理解了,
我就是这么手模过来的~~~