aoj0558
一、題意:?在H * W的地圖上有N個奶酪工廠,分別生產硬度為1-N的奶酪。有一只吃貨老鼠準備從老鼠洞出發吃遍每一個工廠的奶酪。老鼠有一個體力值,初始時為1,每吃一個工廠的奶酪體力值增加1(每個工廠只能吃一次),且老鼠只能吃硬度不大于當前體力值的奶酪。老鼠從當前格走到相鄰的無障礙物的格(上下左右)需要時間1單位,有障礙物的格不能走。走到工廠上時即可吃到該工廠的奶酪,吃奶酪時間不計。問吃遍所有奶酪最少用時。
?
二、思路:從0到n,做n次bfs,求出各個最短路徑后相加。這里需要注意一下幾點:1、沒做一次bfs之前距離矩陣要初始化? 2、可以在輸入時就記錄下起始位置和各個奶酪工廠的坐標,也可以在做bfs的過程中通過數值進行判斷,都可以,只是提前記錄下來寫出來的代碼思路會更清晰一點,所付出的就是增加一定的空間。
?
三、代碼:
#include"iostream" #include"stdio.h" #include"queue" using namespace std;const int MAXN=1005; const int INF=100000000; typedef pair<int,int> P;char maze[MAXN][MAXN]; int dist[MAXN][MAXN]; P factory[15];int h,w,n;void DistOrigin() {for(int i=0;i<h;i++)for(int j=0;j<w;j++)dist[i][j]=INF; }bool Judge(int x,int y) {if(x>=0&&x<h&&y>=0&&y<w&&maze[x][y]!='X'&&dist[x][y]==INF)return true;return false; }int Bfs(P pS,P pE) {queue<P> que;DistOrigin();dist[pS.first][pS.second]=0;que.push(pS);while(que.size()){P p=que.front();que.pop();if(p==pE) break;int dx[4]={0,1,0,-1};int dy[4]={1,0,-1,0};for(int i=0;i<4;i++){int nx=p.first+dx[i];int ny=p.second+dy[i];if(Judge(nx,ny)){dist[nx][ny]=dist[p.first][p.second]+1;que.push(P(nx,ny));}}}return dist[pE.first][pE.second]; }int main() {while(scanf("%d%d%d",&h,&w,&n)==3){for(int i=0;i<h;i++){for(int j=0;j<w;j++){cin>>maze[i][j];char tmp=maze[i][j];if(tmp!='.'&&tmp!='X'){if(tmp=='S'){factory[0]=P(i,j);}else{factory[tmp-'0']=P(i,j);}}}}int sum=0;for(int i=0;i<n;i++){int time=Bfs(factory[i],factory[i+1]);if(time!=INF)sum+=time;elsebreak;}cout<<sum<<endl;}return 0; }
轉載于:https://www.cnblogs.com/acm-jing/p/9562915.html
與50位技術專家面對面20年技術見證,附贈技術全景圖總結
- 上一篇: oracle数值类型--LOB+ROWI
- 下一篇: git版本管理规范