标签:static bsp 枚举 row show open img div 而且
Michael喜欢滑雪百这并不奇怪, 因为滑雪的确很刺激。可是为了获得速度,滑的区域必须向下倾斜,而且当你滑到坡底,你不得不再次走上坡或者等待升降机来载你。Michael想知道载一个区域中最长底滑坡。区域由一个二维数组给出。数组的每个数字代表点的高度。下面是一个例子
1 2 3 4 5
16 17 18 19 6
15 24 25 20 7
14 23 22 21 8
13 12 11 10 9
一个人可以从某个点滑向上下左右相邻四个点之一,当且仅当高度减小。在上面的例子中,一条可滑行的滑坡为24-17-16-1。当然25-24-23-...-3-2-1更长。事实上,这是最长的一条。
思路:经典的滑雪问题,每个点去枚举一遍即可,枚举过程中用flat[]记录已经得到的值,dfs即可
1 import java.io.BufferedReader; 2 import java.io.IOException; 3 import java.io.InputStreamReader; 4 import java.util.Arrays; 5 import java.util.Scanner; 6 7 public class Main1088 { 8 static int dir[][]= {{0,1},{0,-1},{1,0},{-1,0}}; 9 static int R,C,longsum,sum; 10 static int map[][]; 11 static int flat[][]; 12 public static void main(String args[]) throws IOException 13 { 14 BufferedReader sc=new BufferedReader(new InputStreamReader(System.in)); 15 String s=sc.readLine(); 16 String S[]=s.split(" "); 17 R=Integer.parseInt(S[0]);C=Integer.parseInt(S[1]); 18 map=new int[R][C]; 19 flat=new int[R][C]; 20 for(int i=0;i<R;i++) 21 { 22 String s1=sc.readLine(); 23 String S1[]=s1.split(" "); 24 for(int j=0;j<C;j++) 25 map[i][j]=Integer.parseInt(S1[j]); 26 } 27 for(int i=0;i<R;i++) 28 for(int j=0;j<C;j++) 29 { 30 longsum=Math.max(longsum, dfs(i,j)); 31 32 } 33 System.out.println(longsum); 34 } 35 public static int dfs(int x,int y) 36 { 37 if(flat[x][y]!=0) 38 return flat[x][y]; 39 flat[x][y]=1; 40 for(int i=0;i<4;i++) 41 { 42 int dx=x+dir[i][0]; 43 int dy=y+dir[i][1]; 44 if(dx>=0&&dy>=0&&dx<R&&dy<C) 45 if(map[dx][dy]<map[x][y]) 46 { 47 flat[x][y]=Math.max(dfs(dx,dy)+1,flat[x][y]); 48 } 49 } 50 return flat[x][y]; 51 } 52 }
标签:static bsp 枚举 row show open img div 而且
原文地址:https://www.cnblogs.com/gdskl/p/11445813.html