筆試刷題-滴滴
阿新 • • 發佈:2019-01-28
題目描述:(此題目是同一思路,另外的路徑儲存方式)
/** 小青蛙有一天不小心落入了一個地下迷宮, 小青蛙希望用自己僅剩的體力值P跳出這個地下迷宮。 為了讓問題簡單,假設這是一個n*m的格子迷宮, 迷宮每個位置為0或者1,0代表這個位置有障礙物, 小青蛙達到不了這個位置;1代表小青蛙可以達到的位置。 小青蛙初始在(0,0)位置, 地下迷宮的出口在(0,m-1)(保證這兩個位置都是1, 並且保證一定有起點到終點可達的路徑), 小青蛙在迷宮中水平移動一個單位距離需要消耗1點體力值, 向上爬一個單位距離需要消耗3個單位的體力值,向下移動不消耗體力值, 當小青蛙的體力值等於0的時候還沒有到達出口,小青蛙將無法逃離迷宮。 現在需要你幫助小青蛙計算出能否用僅剩的體力值跳出迷宮(即達到(0,m-1)位置)。 輸入描述: 輸入包括n+1行: 第一行為三個整數n,m(3 <= m,n <= 10),P(1 <= P <= 100) 接下來的n行: 每行m個0或者1,以空格分隔 輸出描述: 如果能逃離迷宮,則輸出一行體力消耗最小的路徑, 輸出格式見樣例所示;如果不能逃離迷宮, 則輸出"Can not escape!"。 測試資料保證答案唯一 輸入例子1: 4 4 10 1 0 0 1 1 1 0 1 0 1 1 1 0 0 1 1 輸出例子1: [0,0],[1,0],[1,1],[2,1],[2,2],[2,3],[1,3],[0,3] */
思路:
DFS或者BFS加上一個方向的cost陣列即可
程式碼實現:
#include<stdio.h> #include<iostream> #include<vector> #include<climits> #define MAX_M 15 #define MAX_N 15 using namespace std; //題目資訊的結構 int m, n, p; int dx[4]={-1,1,0,0}; int dy[4]={0,0,-1,1}; int cost[4]={0,3,1,1}; bool graph[MAX_M][MAX_N]; //問題需要維護的結構 int lastRestPower=INT_MIN; vector<int> resx, resy, tempx, tempy; //dfs並更新 bool DFS(int curx, int cury, int tx, int ty, int restPower){ bool flag = false; graph[curx][cury] = false; tempx.push_back(curx); tempy.push_back(cury); if(curx==tx && cury==ty){ //若剛好到達則更新資料結構 if(restPower>lastRestPower){ resx=vector<int>(tempx); resy=vector<int>(tempy); lastRestPower=restPower; } flag=true; } else{ //嘗試4個方向 for(int d=0; d<4; d++){ int nextx=curx+dx[d], nexty=cury+dy[d]; if(nextx<0 || nextx>=m || nexty<0 || nexty>=n){ //出界 continue; } else if(!graph[nextx][nexty]){ //有障礙 continue; } else if(restPower<cost[d]){ //體力達不到 continue; } else{ flag|=DFS(nextx,nexty,tx,ty,restPower-cost[d]); } } } tempx.pop_back(); tempy.pop_back(); graph[curx][cury]=true; return flag; } int main(){ scanf("%d%d%d", &m, &n, &p); for(int i=0; i<m; i++){ for(int j=0; j<n; j++){ int data; scanf("%d", &data); if(data==0){ graph[i][j] = false; } else if(data==1){ graph[i][j] = true; } } } bool flag = DFS(0,0, 0,n-1,p); if(!flag){ printf("Can not escape!"); } else{ if(resx.size()==0 || resy.size()==0) return -1; if(resx.size()!=resy.size()) return -2; int len = resx.size(); printf("[%d,%d]", resx[0], resy[0]); for(int i=1; i<len; i++){ printf(",[%d,%d]", resx[i], resy[i]); } } return 0; }