アットウィキロゴ

全体公開 > 合同練習会 > 20130323 > G エレベータの故障

問題の概要

壊れて, 上にはu階, 下にはd階しか下がれないエレベータがある.
下は1階から, 上はf階まであり, それらを超えた所は指定出来ない.
s階からg階まで, 最短でどれだけで着けるか.

実装の方針, 注意点

+ ...
既に訪れた階を省いた, 幅優先探索をする.
初期化や既に訪れた階の判定のやりやすさから, d[階数]=最短ボタン押下回数+1 なる配列を用いた.

ソースコード

+ ...
  1. bool inRange(int a, int x, int b){
  2. return a <= x && x < b;
  3. }
  4.  
  5. bool solve(){
  6. int f, s, g, up, dn;
  7. cin >> f >> s >> g >> up >> dn;
  8. if(!f) return false;
  9.  
  10. int d[1000010] = {};
  11. d[s] = 1;
  12.  
  13. queue<int> q;
  14. q.push(s);
  15.  
  16. while(!q.empty()){
  17. s = q.front(); q.pop();
  18. if(inRange(1, s-dn, f+1) && !d[s-dn]){
  19. d[s-dn] = d[s] + 1;
  20. q.push(s-dn);
  21. }
  22. if(inRange(1, s+up, f+1) && !d[s+up]){
  23. d[s+up] = d[s] + 1;
  24. q.push(s+up);
  25. }
  26. }
  27. if(d[g]){
  28. cout << d[g]-1 << endl;
  29. }else{
  30. cout << "use the stairs" << endl;
  31. }
  32. return true;
  33. }
  34.  



最終更新:2013年03月27日 00:17