题意是:给你一个n*m的矩阵,上面的数字代表了这个位置的高度,你现在站在矩阵外面,问能不能走到矩阵的最高处,走法与现实游戏一样,往上爬只能爬一个高度,或者水平走,或者往下跳都可以。
有两种方案,一个是从矩阵的边缘依次进入后dfs,判断能不能走到最高点,二是从最高点往矩阵外面走,看能不能走出去,我觉得后者的时间要少点代码也更简单,所以我写了后者的代码。
#include<iostream>
using namespace std;
int mat[105][105];
int vis[105][105];
int dir[4][2] = {
{-1, 0}, {0, 1}, {1, 0}, {0, -1}
};
int n, m;
bool dfs(int x, int y)
{
vis[x][y] = 1;
if(x == 0 || x == n+1 || y == 0 || y == m+1)
return 1;
for(int i = 0; i < 4; i++)
{
int xx = x + dir[i][0];
int yy = y + dir[i][1];
if(!vis[xx][yy] && (mat[xx][yy] >= mat[x][y]-1))
{
int val = dfs(xx, yy);
if(val)return 1;
}
}
return 0;
}
int main()
{
while(~scanf("%d%d", &n, &m))
{
int MAX = 0;
memset(mat, 0, sizeof(mat));
for(int i = 1; i <= n; i++)
{
for(int j = 1; j <= m; j++)
{
scanf("%d", &mat[i][j]);
if(MAX < mat[i][j])
MAX = mat[i][j];
}
}
int flag = 0;
memset(vis, 0, sizeof(vis));
for(int i = 1; i <= n; i++)
{
for(int j = 1; j <= m; j++)
{
if(mat[i][j] == MAX)
{
if(dfs(i, j))
{
flag = 1;
break;
}
}
}
if(flag)break;
}
if(flag)
printf("YES\n");
else
printf("NO\n");
}
return 0;
}