国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

【LeetCode困難】1263. 推箱子

這篇具有很好參考價值的文章主要介紹了【LeetCode困難】1263. 推箱子。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

「推箱子」是一款風靡全球的益智小游戲,玩家需要將箱子推到倉庫中的目標位置。

游戲地圖用大小為 m x n 的網格 grid 表示,其中每個元素可以是墻、地板或者是箱子。

現(xiàn)在你將作為玩家參與游戲,按規(guī)則將箱子 ‘B’ 移動到目標位置 ‘T’ :

玩家用字符 ‘S’ 表示,只要他在地板上,就可以在網格中向上、下、左、右四個方向移動。
地板用字符 ‘.’ 表示,意味著可以自由行走。
墻用字符 ‘#’ 表示,意味著障礙物,不能通行。
箱子僅有一個,用字符 ‘B’ 表示。相應地,網格上有一個目標位置 ‘T’。
玩家需要站在箱子旁邊,然后沿著箱子的方向進行移動,此時箱子會被移動到相鄰的地板單元格。記作一次「推動」。
玩家無法越過箱子。
返回將箱子推到目標位置的最小 推動 次數(shù),如果無法做到,請返回 -1。

示例 1:
【LeetCode困難】1263. 推箱子
輸入:grid = [[“#”,“#”,“#”,“#”,“#”,“#”],
[“#”,“T”,“#”,“#”,“#”,“#”],
[“#”,“.”,“.”,“B”,“.”,“#”],
[“#”,“.”,“#”,“#”,“.”,“#”],
[“#”,“.”,“.”,“.”,“S”,“#”],
[“#”,“#”,“#”,“#”,“#”,“#”]]
輸出:3
解釋:我們只需要返回推箱子的次數(shù)。
示例 2:

輸入:grid = [[“#”,“#”,“#”,“#”,“#”,“#”],
[“#”,“T”,“#”,“#”,“#”,“#”],
[“#”,“.”,“.”,“B”,“.”,“#”],
[“#”,“#”,“#”,“#”,“.”,“#”],
[“#”,“.”,“.”,“.”,“S”,“#”],
[“#”,“#”,“#”,“#”,“#”,“#”]]
輸出:-1
示例 3:

輸入:grid = [[“#”,“#”,“#”,“#”,“#”,“#”],
[“#”,“T”,“.”,“.”,“#”,“#”],
[“#”,“.”,“#”,“B”,“.”,“#”],
[“#”,“.”,“.”,“.”,“.”,“#”],
[“#”,“.”,“.”,“.”,“S”,“#”],
[“#”,“#”,“#”,“#”,“#”,“#”]]
輸出:5
解釋:向下、向左、向左、向上再向上。

提示:

m == grid.length
n == grid[i].length
1 <= m, n <= 20
grid 僅包含字符 ‘.’, ‘#’, ‘S’ , ‘T’, 以及 ‘B’。
grid 中 ‘S’, ‘B’ 和 ‘T’ 各只能出現(xiàn)一個。

這道題和上周華為暑期實習筆試的第三題有點相似,但個人感覺這道題難度更大。首先給這道題扣個帽子,屬于一道搜索,但是不同于一般的搜索,這道題的搜索過程明顯要麻煩一些。先說一下自己之前的錯誤思路:
①將整個問題分解為兩個問題:人如何到達箱子邊下以及箱子如何再到達終點。
②以人為起點進行廣搜,當和箱子相遇之后就合為一體。

對于第一個思路,錯誤之處在于這是一個整體考慮的問題,并不是單獨拆分就可以實現(xiàn)的,整體的最優(yōu)值并不一定完全等于拆分后的最優(yōu)值。而對于第二個思路,完全是讀錯了題目,題目要求的是,要計算推動箱子的次數(shù),人推一下箱子之后,完全可以離開箱子跑到另一個位置來推。

最近一直在干組里的活,沒時間仔細研究這道題,所以參考題解寫了一版自己的代碼。根據(jù)官方給的題解,這道題可以看作是一個復雜狀態(tài)下的廣搜,為什么說復雜呢,一般的廣搜我們只需要考慮行動者的狀態(tài),一般就是那個能移動的個體,但是這道題,我們還需要將狀態(tài)擴展為人和箱子的狀態(tài),箱子在不同的位置時,人即使坐標一樣,也代表不同的狀態(tài)。我們依然是以人為行動者,向四個方向進行搜索,當人的位置與當前箱子的位置重合,說明人推到了箱子,此時按照人移動的方向對箱子進行同樣的移動,同時對狀態(tài)數(shù)組進行增加來表示推過了一次箱子。此外,與一般的廣度優(yōu)先搜索不同,我們不能使用flag來標記哪些地方走過了哪些沒走過,因為推動箱子之后可能存在更換方向推動箱子的情況,根據(jù)題解的方法,當我們推動箱子時,狀態(tài)的改變會存入另一個隊列,在下一輪循環(huán)中再進行廣搜。

int dir[4][2] = {0, 1, 0, -1, 1, 0, -1, 0};
int step[25][25][25][25];

int height, length;

int minPushBox(vector<vector<char> >& grid) {
	int sx, sy, ex, ey, bx, by;

	height = grid.size();
	length = grid[0].size();
	for(int i=0; i<height; i++){
		for(int j=0; j<length; j++){
			for(int m=0; m<height; m++){
				for(int n=0; n<length; n++){
					step[i][j][m][n] = INT_MAX;
				}
			}
		}
	}
	for(int i=0; i<height; i++){
		for(int j=0; j<length; j++){
			char c = grid[i][j];
			
			if(c=='S'){
				sx = i;
				sy = j;
			}
			if(c=='T'){
				ex = i;
				ey = j;
			}
			if(c=='B'){
				bx = i;
				by = j;
			}
		}
	}
	step[sx][sy][bx][by] = 0;
	queue<pair<pair<int, int>, pair<int, int> > > q;
	q.push(make_pair(make_pair(sx, sy), make_pair(bx, by)));
	while(!q.empty()){
		queue<pair<pair<int, int>, pair<int, int> > > q1;
		while(!q.empty()){
			pair<pair<int, int>, pair<int, int> > temp = q.front();
			q.pop();
			
			int npx = temp.first.first;
			int npy = temp.first.second;
			int nbx = temp.second.first;
			int	nby = temp.second.second;
			if(nbx==ex && nby==ey)
				return step[npx][npy][nbx][nby];
			
			for(int i=0; i<4; i++){
				int tpx = npx + dir[i][0];
				int tpy = npy + dir[i][1];
				 
				if(tpx<0||tpy<0||tpx>=height||tpy>=length||grid[tpx][tpy]=='#')
					continue;
				if(tpx==nbx && tpy==nby){
					// 推到了箱子 
					int tbx = nbx + dir[i][0];
					int tby = nby + dir[i][1];
					if(tbx<0||tby<0||tbx>=height||tby>=length||grid[tbx][tby]=='#')
						continue;
						
					if(step[tpx][tpy][tbx][tpy] <= step[npx][npy][nbx][nby] + 1)
						continue;
					
					step[tpx][tpy][tbx][tby] = step[npx][npy][nbx][nby] + 1;
					
					q1.push(make_pair(make_pair(tpx, tpy), make_pair(tbx, tby)));
				}else{
					// 沒有推到箱子 
					if(step[tpx][tpy][nbx][nby] <= step[npx][npy][nbx][nby])
						continue;
					step[tpx][tpy][nbx][nby] = step[npx][npy][nbx][nby];
					q.push(make_pair(make_pair(tpx, tpy), make_pair(nbx, nby)));
				}	
			}
		}
		q.swap(q1);
	}
	return -1;
}

相比于題解的代碼,我稍微改了一下數(shù)據(jù)結構的寫法,按道理理解起來要稍微容易那么一點點,但是內存開銷增加了不少,題解用的是一個數(shù)來表示二維的坐標,在定位以及四方向移動時會稍微麻煩點,所以我直接換成了四維數(shù)組,前兩維表示人的位置,后兩維表示箱子的位置,思路還是按照題解的思路。從人的位置開始四方向搜索,位置合法的情況下,判斷是否與箱子的坐標產生了重疊,如果沒有,那就繼續(xù)搜索,但是在繼續(xù)搜索的時候,為了避免重復走的問題,我們需要用step進行去重,也就是step[tpx][tpy][nbx][nby] <= step[npx][npy][nbx][nby]這個條件,這個條件實際上是在說,我們按照某個路徑一直搜,搜索到頭發(fā)現(xiàn)是個死路,如果不加這個條件,我們就會按照原路返回從而死循環(huán),由于一開始我們設定了step的值全是最大值,只把起始位置改成了0,也就是說在第一輪搜索的過程中,所有走過的位置都改成了0,此時當走到死路的時候,就可以利用這個條件避免重走回頭路。但是如果這個過程我們推到了箱子,事情就是另一回事了,我們推到了箱子,再走回頭路就是允許的,因為此時我們可能是在利用回頭路移動到箱子的另一個方向,但是回頭路的回頭路依然是不允許的,回頭路的回頭路依然是用step[tpx][tpy][nbx][nby] <= step[npx][npy][nbx][nby]進行篩選。值得一提的是,我們推到箱子之后,用q1進行了單獨存儲,這本質上是想讓推到箱子作為開啟下一次循環(huán)。我們每次循環(huán),是從上一次的狀態(tài),在不走重復路的基礎上,遍歷所有路徑找到能夠推到箱子的新狀態(tài),下次在這部分的狀態(tài)上進行繼續(xù)的搜索。文章來源地址http://www.zghlxwxcb.cn/news/detail-442317.html

到了這里,關于【LeetCode困難】1263. 推箱子的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網!

本文來自互聯(lián)網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。如若轉載,請注明出處: 如若內容造成侵權/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經查實,立即刪除!

領支付寶紅包贊助服務器費用

相關文章

  • Java課程設計之推箱子

    ? 推箱子游戲是一個比較古老的游戲,深受廣大游戲愛好者的歡迎,它在帶來樂趣的同時也能培養(yǎng)我們的反應力以及嚴謹?shù)乃季S能力。 ? 游戲規(guī)則是要求角色將地圖中所有放置的箱子推到指定目標位置,只有合理安排移動次序和位置?,才能順利完成任務。 ? 項目任務是用

    2024年02月08日
    瀏覽(29)
  • c++推箱子小游戲

    上代碼: 由于寫游戲時間較長,更新較慢,請大佬們理解一下

    2024年02月09日
    瀏覽(22)
  • 推箱子大冒險(SDL/C)

    推箱子大冒險(SDL/C)

    歡迎來到小K的SDL專欄第三小節(jié),本節(jié)將為大家?guī)硇№椖縹C語言SDL版坤坤推箱子詳細講解,這里也為大家上傳了源碼和圖片資源,需要的自取看完以后,希望對你有所幫助 ?效果如下 2023-05-26-14-19-21推箱子 ? 第一步 ,我們先用枚舉把下圖中的元素表示出來,分別為 空地、墻

    2024年02月06日
    瀏覽(22)
  • 使用Python語言寫一個推箱子游戲

    本游戲旨在提供一個趣味性的益智游戲,玩家需要通過推動箱子到指定位置來過關。 玩家需要推動一個或多個箱子到指定位置,才能過關。 箱子只能向前推,不能拉回來。 箱子不允許被推到障礙物、墻壁或其他箱子上。 玩家可以通過 UNDO 按鈕來撤回上一步操作,最多可以撤

    2024年02月05日
    瀏覽(17)
  • java版本實現(xiàn)推箱子小游戲

    推方塊 游戲簡介: 由 ↑,↓,←,→鍵來控制方向,點擊空格鍵表示重玩當前關卡。 核心代碼部分 :就是如何處理人的移動和人和箱子一起時的移動,這里需要對人要走的下一步和人推著箱子一起走的下一步進行判斷分析,如果沒有被阻擋就可以繼續(xù)走下一步。(有興趣

    2024年02月11日
    瀏覽(35)
  • python小游戲——推箱子代碼開源

    python小游戲——推箱子代碼開源

    ?? 作者:小劉在這里 ?? 每天分享云計算網絡運維課堂筆記,努力不一定有回報,但一定會有收獲加油!一起努力,共赴美好人生! ?? 夕陽下,是最美的,綻放,愿所有的美好,再疫情結束后如約而至。 目錄 一.效果呈現(xiàn) ?二.主代碼 三.cfg 四.README \\\'\\\'\\\'配置文件\\\'\\\'\\\' imp

    2024年02月02日
    瀏覽(30)
  • C/C++項目實戰(zhàn)-推箱子小游戲
  • 怎樣使用Pyglet庫給推箱子游戲畫關卡地圖

    怎樣使用Pyglet庫給推箱子游戲畫關卡地圖

    目錄 pyglet庫 畫圖事件 按鍵事件 程序擴展 關卡地圖 是一個跨平臺的Python多媒體庫,提供了一個簡單易用的接口來創(chuàng)建窗口、加載圖像和視頻、播放音頻、處理用戶輸入事件以及進行2D圖形繪制。特別適合用于游戲開發(fā)、視聽應用以及其它需要高效圖形渲染和音頻播放的項目

    2024年02月22日
    瀏覽(19)
  • 【HTML小游戲】推箱子網頁版(附完整源碼)

    【HTML小游戲】推箱子網頁版(附完整源碼)

    最近剛剛更新完了HTML,CSS的萬字總結 ,有很多人已經學習完了文章,感覺反饋還不錯,今天,用HTML,CSS,JS的知識編寫了一個童年經典游戲 - 推箱子,供學習參考。 游戲主界面展示: 游戲界面展示: 經典的推箱子是一個非常古老游戲,甚至是80,90年代的回憶,目的是在訓

    2024年02月04日
    瀏覽(31)
  • Unity游戲源碼分享-3d機器人推箱子游戲

    Unity游戲源碼分享-3d機器人推箱子游戲

    Unity游戲源碼分享-3d機器人推箱子游戲 一個非常意思的3D游戲 ? ?工程地址:https://download.csdn.net/download/Highning0007/88098014

    2024年02月15日
    瀏覽(26)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領取紅包,優(yōu)惠每天領

二維碼1

領取紅包

二維碼2

領紅包