2010-01-14

http://anond.hatelabo.jp/20100114003544

34分

現役のときに比べて腕が鈍ってるなあ

ソースは汚いよ


同じところを二回訪れないことに注意して、次の状態をキューに入れていけばいいだけ

隣は距離1なのでただのFIFOでいい

重み付きのグラフならpriority queueを使う


dequeなんちゃらの前までが入力で、while の中が重要コード

答えはSとGも塗り潰しちゃったのを出力してる

サンプルの入力で最短距離であることを確認してる


増田できれいにC++を出力するにはどうすればいいんだろう?

#include <map&gt;
#include <string&gt;
#include <iostream&gt;
#include <vector&gt;
#include <iterator&gt;
#include <deque&gt;
#include <set&gt;

using namespace std;
typedef pair<int, int&gt; P;

int dir_x[] = {0,1, -1, 0};
int dir_y[] = {1, 0, 0, -1};

int main() {
  string line;
  vector<string&gt; input;

  while (getline(cin, line)) {
    input.push_back(line);
  }
  const int X = input.size();
  const int Y = input.begin()-&gt;size();

  vector<P&gt; start;
  P goal;
  for (int i = 0; i < X; i++) {
    for (int j = 0; j < Y; j++) {
      if (input[i][j] == 'S') {
        start.push_back(P(i, j));
      }
      else if (input[i][j] == 'G') {
        goal = P(i, j);
      }
    }
  }

  deque<vector<P&gt; &gt; Q;
  set<P&gt; visited;
  Q.push_back(start);

  while (!Q.empty()) {
    vector<P&gt; p = Q.front();
    Q.pop_front();

    if (visited.find(p.back()) != visited.end()) { continue; }
    visited.insert(p.back());

    if (p.back() == goal) {
      for (int i = 0; i < p.size(); i++) {
        input[p[i].first][p[i].second] = '$';
      }
      copy(input.begin(), input.end(), ostream_iterator<string&gt;(cout, "\n"));
      break;
    }

    for (int i = 0; i < 4; i++) {
      P next = P(p.back().first + dir_x[i], p.back().second + dir_y[i]);
      if (input[next.first][next.second] == '*') { continue; }
      vector<P&gt; new_state(p.begin(), p.end());
      new_state.push_back(next);
      Q.push_back(new_state);
    }
  }
  return 0;
}
記事への反応 -
  • 少し遅れた感があるけど、解いてみた。 出力がテキストでないけど・・・。 仕事の合間を使ってやったものの、昼前に始めたのが5時頃にようやくできる程度。 これを25分とは尋常じゃ...

    • コンピュータサイエンスの教育を受けた人や、ACM/ICPCとかtop coderとかやってる人なら、このての問題はすぐ解けるよ 解けない(問題を知らない、解きかたを知らない)と、はずかしいレ...

      • 増田のelegantな解答を拝見したい

        • 34分 現役のときに比べて腕が鈍ってるなあ ソースは汚いよ 同じところを二回訪れないことに注意して、次の状態をキューに入れていけばいいだけ 隣は距離1なのでただのFIFOでいい 重み...

          • ワープあり迷宮とかだったらもっと楽しかったのにw

            • 単純にグラフ作ってdijkstraで解けるような拡張だとつまらない 入力のサイズが大きすぎて、普通の解法が通用しなくて、計算量を減らす必要があるとかだと楽しい 例えば、このタイプの...

              • こういう話題を見てると、俺ってつくづくプログラミングそのものには興味が無いなーって思う。 色々小細工してリソースを効率的に使うとか全く興味が無い。どうでもいいから適当に...

                • リソース減らすってのは、技術というより、現実優先なんだよね。 プロダクトを実際に作ると、どうしても、複数のプログラムが一緒に動いていたり、 メモリ減らすとチップを1つ下の...

                  • そういえば、昔、巨大なデーターを扱うプログラムで 遅いというクレームがついて みんなで、早くしましょう。 増田さんの担当分は3時間未満になるようにしてください。って言われ...

                    • その時点ですでに俺のパートは1時間前後だったわけだが。 なら、納期ギリギリまでボケッと遊ぶなり別の勉強するなりして自分の担当分には手を加えず、提出する時に「なんとかが...

              • まずは、巨大な迷路を書くプログラムからだな。 学生時代だったらアルゴリズムを覚えていたので数十分だが いまだと数時間はかかりそう。 とりあえず、巨大な迷路データーが無いこ...

    • そうは言っても、やっぱりあいつは偉そうだけどね。 こんなプログラムできなくても仕事にはなんの問題もないよ。

    • これで40分。 タイムアタックってことでアルゴリズムは全幅探索で書き上げました。 エラーチェック皆無。 A*ならもう5分ほど延びるかな? using System;using System.Collections.Generic;using System.L...

      • [増田@hatelabo.jp]gmcs test.cs -r:System.Xml.Linq -out:test.exe test.cs(108,12): warning CS0660: `Maze.Position' defines operator == or operator != but does not override Object.Equals(object o) test.cs(108,12): warning CS0661: `Maze.Position' define...

      • なんか、経路問題だけあって、できてる人のほうが多い印象だよね。 所詮プログラムなんだから、普通にだれでもできるよねぇ。 所詮やっぱり、プログラマはブルーワーカーか アルゴ...

記事への反応(ブックマークコメント)

ログイン ユーザー登録
ようこそ ゲスト さん