題意是:給你一個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;
}