実際には、簡単な幅広い検索し、基本的にルーチン。しかし、どのようなダイナミックな規制に重い刑は、同じ理由で、状態はパラメータkのk次元の配列で表現されたとき、あなたは2次元配列の状態の3つのパラメータを使用することはできません、つまり、注意すべきは、再宣告ではありませんA。たとえば:
百回のトレーニング4115:ナルトとサスケは
私が行うには郭神の方法である質問、救助活動を行うために始めた、つまり別のブール変数を殺さ(実際には、T + 2に直接ステップであります2段階)が、私は唯一訪問した[MAXN] [MAXN]配列は、あまりにもしているので、このチャクラを指すように重い刑にこのチャクラを考慮し、とにかく考えるためにスマートにしようとしないでは1を消費します、夜までの朝同じですが、明らかにこのアイデアは、多分、最初の数奇妙な少し長いルートは、以上のいくつかの奇妙な短いルート、一般的なライン以前よりもさらにいくつかの奇妙た後、このルートの後ろにいくつかの奇妙な少し短いを果たしているので、間違っているしますケース間違いました。
ああ......最近いつもより多くの愚かな。しかし、能力はそれの要因の一つです。キーは単独で機械的に動くが、正しく方法のと状態の説明を理解するために何を測定するのではなく、状態はアルゴリズムのすべてに拡張しました。
いいえナンセンスない、ACコード:
//POJ 4115 鸣人和佐助
#include <iostream>
#include <queue>
using namespace std;
const int MAXN = 202;
const int MAXT = 12;
struct state {
int x, y;
int chakra;
int t;
friend bool operator < (const state & a, const state & b) {
//if (a.t == b.t) return (a.chakra < b.chakra);
return (a.t > b.t);
}
state(int _x, int _y, int _chakra, int _t): x(_x), y(_y), chakra(_chakra), t(_t) {}
};
int visited[MAXN][MAXN][MAXT];
//int visited[MAXN][MAXN];
int M, N, T;
char map[200][201];
int sx, sy;
int dx[] = {-1, 0, 1, 0};
int dy[] = {0, -1, 0, 1};
int legal(int x, int y, int chakra) {
if (x < 0 || x >= M || y < 0 || y >= N) return 0;
if (map[x][y] == '#' && chakra == 0) return 0;
if (visited[x][y][chakra]) return 0;
//if (visited[x][y]) return 0;
return 1;
}
int main() {
cin >> M >> N >> T;
for (int i = 0; i < M; ++i) {
for (int j = 0; j < N; ++j) {
cin >> map[i][j];
if (map[i][j] == '@') {
sx = i;
sy = j;
}
}
}
priority_queue <state> Q;
state init(sx, sy, T, 0);
Q.push(init);
while(!Q.empty()) {
init = Q.top();
Q.pop();
if (map[init.x][init.y] == '+') {
cout << init.t << endl;
return 0;
}
for (int i = 0; i < 4; ++i) {
if (!legal(init.x + dx[i], init.y + dy[i], init.chakra)) continue;
if (map[init.x + dx[i]][init.y + dy[i]] == '#') {
//visited[init.x + dx[i]][init.y + dy[i]] = 1;
visited[init.x + dx[i]][init.y + dy[i]][init.chakra - 1] = 1;
Q.push(state(init.x + dx[i], init.y + dy[i], init.chakra - 1, init.t + 1));
}
else {
//visited[init.x + dx[i]][init.y + dy[i]] = 1;
visited[init.x + dx[i]][init.y + dy[i]][init.chakra] = 1;
Q.push(state(init.x + dx[i], init.y + dy[i], init.chakra, init.t + 1));
}
}
}
cout << -1 << endl;
return 0;
}