zoukankan      html  css  js  c++  java
  • nyoj 题目10 skiing —— 南阳oj

    题目信息例如以下:

    skiing

    时间限制:3000 ms  |  内存限制:65535 KB
    难度:5
    描写叙述
    Michael喜欢滑雪百这并不奇怪, 由于滑雪的确非常刺激。但是为了获得速度,滑的区域必须向下倾斜,并且当你滑到坡底,你不得不再次走上坡或者等待升降机来载你。Michael想知道载一个区域中最长底滑坡。区域由一个二维数组给出。

    数组的每一个数字代表点的高度。

    以下是一个样例 
    1 2 3 4 5

    16 17 18 19 6

    15 24 25 20 7

    14 23 22 21 8

    13 12 11 10 9

    一个人能够从某个点滑向上下左右相邻四个点之中的一个。当且仅当高度减小。在上面的样例中。一条可滑行的滑坡为24-17-16-1。

    当然25-24-23-...-3-2-1更长。

    其实,这是最长的一条。


    输入
    第一行表示有几组測试数据,输入的第二行表示区域的行数R和列数C(1 <= R,C <= 100)。以下是R行,每行有C个整数,代表高度h,0<=h<=10000。
    后面是下一组数据。
    输出
    输出最长区域的长度。
    例子输入
    1
    5 5
    1 2 3 4 5
    16 17 18 19 6
    15 24 25 20 7
    14 23 22 21 8
    13 12 11 10 9
    
    例子输出
    25



    源代码例如以下:

    #include<stdio.h>
    int N,HIGH,WIDTH,Max=0;
    int a[101][101];
    void skiing(int m,int n,int t)
    {
    	if (m-1 >=0){
    		if (a[m-1][n] < a[m][n]) skiing(m-1,n,t+1);}
    	if (m+1 < HIGH){
    		if (a[m+1][n] < a[m][n]) skiing(m+1,n,t+1);}
    	if (n-1 >= 0){
    		if (a[m][n-1] < a[m][n]) skiing(m,n-1,t+1);}
    	if (n+1 < WIDTH){
    		if (a[m][n+1] < a[m][n]) skiing(m,n+1,t+1);}
    	if (t > Max) Max = t;
    }
    int main()
    {
    	int i,j;
    	scanf("%d",&N);
    	while(N--)
    	{
    		Max = 0;
    		scanf("%d%d",&HIGH,&WIDTH);
    		for (i=0; i < HIGH;i++)
    			for (j=0; j < WIDTH; j++)
    				scanf("%d",&a[i][j]);
    		for (i=0; i < HIGH;i++)
    			for (j=0; j < WIDTH; j++)
    				skiing(i,j,1);
    		printf("%d
    ",Max);
    	}
    	return 0;
    }
    		
    



  • 相关阅读:
    4. 归并排序
    3. 堆排序
    2. 希尔排序
    1. 选择排序、插入排序、冒泡排序
    1. 拓扑排序
    8. 最大堆
    7. B+树
    6. B树
    5. 二叉查找树、平衡二叉树、红黑树的效率比较
    4. 红黑二叉树
  • 原文地址:https://www.cnblogs.com/wzzkaifa/p/7191264.html
Copyright © 2011-2022 走看看