日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

675. Cut Off Trees for Golf Event

發(fā)布時(shí)間:2023/12/10 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 675. Cut Off Trees for Golf Event 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

這道題目最大的難點(diǎn)是理解題意。

文章目錄

  • 題目理解

題目理解

輸入:一個(gè)非負(fù)的二維數(shù)組
輸出:一個(gè)最短距離
規(guī)則:數(shù)組中的元素如果是0,表示障礙,不能通過。如果是1,表示可以行走的地面。如果大于1表示樹的高度,需要被砍了以后才能行走。
現(xiàn)在要求,每次都從(0,0)出發(fā),按照樹的高度從低到高砍樹。把所有樹都砍完的最短距離是多少。如果不能砍完所有的樹,則返回-1。

[
[1,2,3],
[0,0,4],
[7,6,5]
]
以上面的數(shù)組為例。先對(duì)所有非0節(jié)點(diǎn)按照數(shù)值排序。這個(gè)例子中砍樹的順序應(yīng)該是(0,0)->(0,1)->(0,2)->(1,2)->(2,2)->(2,1)->(2,0)。
那么先計(jì)算(0,0)到(0,0)的最短距離d1。
接著計(jì)算(0,0)到(0,1)的最短距離d2。
接著計(jì)算(0,1)到(0,2)的最短距離d3.

所有距離相加,就是最短距離。

計(jì)算兩個(gè)點(diǎn)之間的最短距離,可以使用bfs。官方解答中還有a星算法。沒想明白為什么那么做。
時(shí)間復(fù)雜度O((mnmn))。我們可能要計(jì)算mn個(gè)節(jié)點(diǎn)的最短路徑,每個(gè)節(jié)點(diǎn)計(jì)算過程中又可能與m*n個(gè)節(jié)點(diǎn)有關(guān)系。

class Solution {private int[][] pos = new int[][]{{-1,0},{1,0},{0,-1},{0,1}};private int m;private int n;public int cutOffTree(List<List<Integer>> forest) {List<int[]> trees = new ArrayList<int[]>();m = forest.size();n = forest.get(0).size();for(int i=0;i<m;i++){for(int j=0;j<n;j++){if(forest.get(i).get(j)>1){trees.add(new int[]{i,j,forest.get(i).get(j)});}}}Collections.sort(trees, new Comparator<int[]>() {public int compare(int[] o1, int[] o2) {return o1[2] - o2[2];}});int ans = 0, sr = 0,sc = 0;for(int[] tree : trees){int d = bfs(forest,sr,sc,tree[0],tree[1]);if(d<0) return -1;ans += d;sr = tree[0];sc = tree[1];}return ans;}private int bfs(List<List<Integer>> forest,int sr,int sc,int tr,int tc){Queue<int[]> queue = new ArrayDeque<int[]>();queue.offer(new int[]{sr,sc});boolean[][] seen = new boolean[m][n];seen[sr][sc] = true;int step = 0;while(!queue.isEmpty()){int size = queue.size();for(int k=0;k<size;k++){int[] array = queue.poll();sr = array[0];sc = array[1];if(sr == tr && sc == tc) return step;for(int i=0;i<4;i++){int nr = sr + pos[i][0];int nc = sc + pos[i][1]; if(nr>=0 && nr<m && nc>=0 && nc<n && seen[nr][nc]==false && forest.get(nr).get(nc)>0){queue.offer(new int[]{nr,nc});seen[nr][nc]=true;}}}step++;}return -1;} }

總結(jié):我第一個(gè)沒有想到的地方是可以先對(duì)樹的高度排序。第二個(gè)沒有想到的是按照從低到高走,找到每一步的最短路徑,和就是總體最短路徑。第三個(gè)沒有想到的是在bfs過程中,我想判斷條件forest.get(nr).get(nc)應(yīng)該大于forest.get(sr).get(sc),這是因?yàn)槲覍忣}不清楚造成的誤解。題目要求按照從低到高砍樹,在從(sr,sc)到(tr,tc)過程中,只要節(jié)點(diǎn)值不為0 都可以通過,并不是說值>(sr,sc)的節(jié)點(diǎn)就不能走。

總結(jié)

以上是生活随笔為你收集整理的675. Cut Off Trees for Golf Event的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。