キーボード入力

タイトル説明

考え

「*」を追加するために、BFSを書き込み先の文字列を開始したいと思い、各VISそれをリセット配列、結果BFSリターンプラス1、そして手紙文字を探し、これは改行であることを示していますこの手紙を印刷するに表す、最初のサンプルの結果がありませんでした。
「動きがない場合は、常に文字の方向で現在位置が異なるカーソルが次にジャンプする」、の次のステップを取ることが判明した。そして言葉の意味を理解していなかった、その見つかった問題、の意味を見て始めましたそれしばらく時間。
第2の、3つの例は、上の第二のサンプルほとんど問題ではなく、第3試料トーンコードを選択します。第三の試料は、各ノードが、少なくとも最終結果の最小ことを保証することはできません、ノードを歩くないことがわかりました。
続いて、まっすぐ行く最初の最後の文字を拡張することができます誰が見て、離れた文字列ではなく、1つの文字に直接行きたいとして、それが答えです。
そして、VIS配列をリセットすることはできません見つかったが、これは、私がBFSを好きではない行く方法を繰り返すことになります。
双方向BFSの面で、その後通帳ので、それを使用しようとするが、これは、文字のため、または配列VIS一連の問題です。
文字の一連の直接状態をBFSのように、他のアイデアから学ぶ、ステータス情報は、座標X、Y、Zを移動するための手順の現在の数を含む、現在の位置を可視に、重量決意のために、情報のこれら4つ、W列に配置されていますこれは、現在の文字列の位置に配列の次元を追加するように配列VIS V [X] [[W] Y]。
そして、間違った答えは、エラー、実行時エラーをコンパイルし 、制限時間を超え、メモリ制限は、 エラーなどのすべての種類を超えています。
ランタイムエラーは、メモリの制限を超えて、コンパイルエラーが発生し、 配列の下に関係の主題は、タイトルが文字列の長さ1万以下で説明されているので、私は答えは、180以上を果たしてきた膨大な数があると思い私はコンパイルエラーに大きなポイントを開いてみたかった、とメモリの制限に断片的なポイントは、アップ実行するには、この時間は、その後少しずつポイントを超え、最初のVIS次元のオープン後に、その上に10005を発見した、最初の次元理由ステップ数をz行かない、wの現在位置が文字列に位置していることを示し、その答えは、ステップ数zを取ることです、私は物事を見ています。
次に、制限時間は、他の人が最初に私が模倣について記述し、位置4つの方向に移動することができる座標各前処理、TOX [4] [X]が参照する、超過 [Y]、玩具[4] [X] [Y]、実行時エラーの結果は、[5] TOXを変更する必要があり、[X] [ Y] Iの...... 1-4は、4つの方向を示し、その結果は、小開口アレイを開きます。
その後そんなに、そして最終的には最終的に、ほとんどのケースで、あなたはそれを見て、それを最適化することができます。

コード

#include <cstdio>
#include <queue>
#include <cstring>

const int inf = 0x3f3f3f3f;
int n, m, vis[10005][55][55], ans, lenTar;
int dirx[] = {0, 1, -1, 0, 0};
int diry[] = {0, 0, 0, 1, -1};
char mp[55][55];
char tar[10005];
int tox[5][55][55], toy[5][55][55];
struct Node {
    // x,y 表示坐标, z 表示走了几步, w表示当前走到的字符串长度
    int x, y, z, w;
} tmp, cur;
std::queue<Node> q;

bool valid(int x, int y) {
    if (x < 1 || x > n) return false;
    if (y < 1 || y > m) return false;
    return true;
}

void init() {
    for (int i = 1; i <= n; ++i) {
        for (int j = 1; j <= m; ++j) {
            for (int k = 1; k <= 4; ++k) {
                int p = i, q = j;
                do {
                    p = p + dirx[k];
                    q = q + diry[k];
                } while (mp[p][q] == mp[i][j]);
                if (valid(p, q)) tox[k][i][j] = p, toy[k][i][j] = q;
                else tox[k][i][j] = inf,  toy[k][i][j] = inf;
            }
        }
    }
}

int bfs() {
    memset(vis, 0x3f, sizeof(vis));
    while (!q.empty()) q.pop();
    tmp.x = 1, tmp.y = 1, tmp.z = 0, tmp.w = 0;
    vis[0][tmp.x][tmp.y] = 0;
    q.push(tmp);
    while (!q.empty()) {
        cur = q.front();
        q.pop();
        while (tar[cur.w + 1] == mp[cur.x][cur.y]) cur.w++, cur.z++;
        if (cur.w == lenTar) return cur.z;
        for (int i = 1; i <= 4; ++i) {
            tmp = cur;
            if (tox[i][cur.x][cur.y] != inf) {
                tmp.x = tox[i][cur.x][cur.y];
                tmp.y = toy[i][cur.x][cur.y];
                tmp.w = cur.w;
                tmp.z = cur.z + 1;
                if (tmp.z < vis[tmp.w][tmp.x][tmp.y]) {
                    vis[tmp.w][tmp.x][tmp.y] = tmp.z;   
                    q.push(tmp);
                }
            }
        }
    }
}
int main() {
    scanf("%d %d", &n, &m);
    for (int i = 1; i <= n; ++i) scanf("%s", mp[i] + 1);
    scanf("%s", tar + 1);
    tar[strlen(tar + 1) + 1] = '*';
    lenTar = strlen(tar + 1);
    init();
    printf("%d\n", bfs());
    return 0;
}

おすすめ

転載: www.cnblogs.com/liuzz-20180701/p/11606674.html