【题目大意】
在一个给定的矩形区域上,找到一条绝对递减的最长路径
【解法】
我一开始是在图上找一个最高点,然后dfs,结果第一个样例都过不了,我找了找这个样例,发现图中有不止一个最高点,所以我就改了一下代码,发现样例过了,就交了一发,结果WA了。仔细想了想,可能这个最长路径不一定事从最高点开始的。于是重新改了一下代码,每个点都dfs一次,取最大值。再交就AC了。
【坑点】
最长路径的起点不一定是最高点。
【AC代码】
#include <cstdio>
#include <iostream>
#include <cstring>
#include <cstdlib>
using namespace std;
int T, R, C;
int map[110][110];
int dx[4] = {-1, 1, 0, 0};
int dy[4] = {0, 0, -1, 1};
int cnt;
struct Point {
int x, y;
int depth;
};
bool check(Point temp, Point P){
if(P.x >= 0 && P.x < R && P.y >= 0 && P.y < C && map[P.x][P.y] < map[temp.x][temp.y]){
return true;
}
return false;
}
void dfs(Point P){
cnt = max(cnt, P.depth);
for(int i = 0; i < 4; i++){
Point newPoint;
newPoint.x = P.x + dx[i];
newPoint.y = P.y + dy[i];
if(check(P, newPoint)){
newPoint.depth = P.depth + 1;
dfs(newPoint);
}
}
}
int main(){
scanf("%d", &T);
string name = "";
while(T--){
cnt = 0;
Point start;
cin >> name >> R >> C;
// cout << name << R << C;
int ans = -1;
for(int i = 0; i < R; i++){
for(int j = 0; j < C; j++){
scanf("%d", &map[i][j]);
if(map[i][j] > ans){
ans = map[i][j];
}
}
}
int aaans = -1;
for(int i = 0; i < R; i++){
for(int j = 0; j < C; j++){
start.x = i;
start.y = j;
start.depth = 1;
dfs(start);
aaans = max(aaans, cnt);
cnt = 0;
}
}
// printf("%d %d %d\n", ans, start.x, start.y);
printf("%s: %d\n", name.c_str(), aaans);
}
return 0;
}