[noj 1559] Jump to the Top of Mountain

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


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章