深度优先遍历应用1

题目描述:

二维数组arr[][]存放int型整数

给定起始位置(x, y).每次只能向上下左右前行一步

每次只能向比arr[x][y]小的数前进,类型递减状态

 

求可行的最长距离与路径

 

------------------------------------------------------

DFS的应用

同时要求保留路径

#include <stdio.h> #include <stdlib.h> #define MAX 100 #define MAX2 200 typedef struct Data{ int x, y; }Data; int arr[MAX][MAX]; bool visit[MAX][MAX]; Data path[MAX2];//用于递归处理的临时路径存放处 Data last[MAX2];//最后的路径结果 int maxLen; void keepPath(int len) { //如果现在path所保存的路径长度小于已经存在的maxLen路径长度,忽略之 if(len < maxLen) return ; maxLen = len; for(int i=0; i<len; i++) { last[i].x = path[i].x; last[i].y = path[i].y; } } //返回4个数的最大值 int get(int x, int y, int a, int b) { int m = x; if(x < y) m = y; if(m < a) m = a; if(m < b) m = b; return m; } //返回的是最长路径长度 int getDes(int row, int col, int x, int y, int level) { if(!(x >= 0 && x < row && y >= 0 && y <col)) return 0; if(visit[x][y]) return 0; Data d; d.x = x; d.y = y; path[level] = d; visit[x][y] = true;//假设访问该点 int key = arr[x][y]; int left, right, up, down; left = right = up = down = 0; if(x-1 >= 0 && arr[x-1][y] < key) up = getDes(row, col, x-1, y, level+1); if(x+1 < row && arr[x+1][y] < key) down = getDes(row, col, x+1, y, level+1); if(y-1 >= 0 && arr[x][y-1] < key) left = getDes(row, col, x, y-1, level+1); if(y+1 < col && arr[x][y+1] < key) right = getDes(row, col, x, y+1, level+1); int max = get(left, right, up, down); //如果当前点下无next可行进,需要保存当前路径 if(max == 0) keepPath(level + 1); visit[x][y] = false;//恢复现场 return max + 1; } int main() { int row, col, x, y; scanf("%d %d", &row, &col); printf("start pointer is :/n"); scanf("%d %d", &x, &y); for(int i=0; i<row; i++) { for(int j=0; j<col; j++) { scanf("%d", &arr[i][j]); } } int len = getDes(row, col, x, y, 0); printf("---------------%d---------------/n", len); for(int i=0; i<len; i++) { printf("%d: map[%d][%d] = %d/n", i, last[i].x, last[i].y, arr[last[i].x][last[i].y]); } system("pause"); return 0; }

你可能感兴趣的:(struct,System,UP,Path)