现在的位置: 首页 > 综合 > 正文

Tyvj 1004 滑雪~

2018年04月29日 ⁄ 综合 ⁄ 共 1042字 ⁄ 字号 评论关闭

       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,,其他的数值都不行的。
    

    贴上模板~~

 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 );
        }

    }

   当做模板记住它~

    其实在很多情况下,如果实在看不出那些大牛们的代码。
    可以手模下,,虽然浪费时间,但是很容易就能理解了,
    我就是这么手模过来的~~~

   

抱歉!评论已关闭.