UVA10285Longest Run on a Snowboard(搜索)

/*
Sample Input
2
Feldberg 10 5
56 14 51 58 88
26 94 24 39 41
24 16 8 51 51
76 72 77 43 10
38 50 59 84 81
5 23 37 71 77
96 10 93 53 82
94 15 96 69 9
74 0 62 38 96
37 54 55 82 38
Spiral 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
Sample Output
Feldberg: 7
Spiral: 25
题意:输入一个n*m的矩阵,问从其中的任意一点开始走,最多可以走多少个位置,
(走的前提是下一个点的值要小于这个点)
*/
#include <iostream>
#include <algorithm>
#include <stdio.h>
#include <string.h>

using namespace std;
int maxx,a[111][111];
int s[4][2] = {{0,1},{1,0},{0,-1},{-1,0}};
bool vis[111][111];
int n,m;
char str[111];

void DFS(int x,int y,int sum)
{
    if(sum > maxx)
        maxx = sum;
    for(int i = 0; i < 4; i ++)
    {
        int tx = x + s[i][0];
        int ty = y + s[i][1];
        if(tx >= 1 && tx <= n && ty >= 1 && ty <= m && !vis[tx][ty])
            if(a[tx][ty] > a[x][y])
            {
                vis[tx][ty] = 1;
                DFS(tx,ty,sum + 1);
                vis[tx][ty] = 0;
            }
    }
}

int main()
{
    int T;
    scanf("%d",&T);
    while(T --)
    {
        memset(a,0,sizeof(a));
        scanf("%s%d%d",str,&n,&m);
        for(int i = 1; i <= n; i ++)
            for(int j = 1; j <= m; ++ j)
                scanf("%d",&a[i][j]);
        maxx = -1;
        for(int i = 1; i <= n; i ++)
            for(int j = 1; j <= m; j ++)
            {
                memset(vis,0,sizeof(vis));
                DFS(i,j,1);
            }
        printf("%s: %d\n",str,maxx);
    }
}

你可能感兴趣的:(搜索,ACM,uva)