2017-05-03 6 views
0

このプログラムを実行すると、ランタイムエラーが発生しますこのプログラムでランタイムエラーを解決する方法

"ランタイムエラー:終了コードは-1073741819"です。

誰かがなぜエラーが発生し、それを修正するのか教えていただけますか?

プログラムは、ラダー(ターゲットワードに到達する最短チェーンの長さ)を見つけています。すなわち、辞書が与えられ、2つの単語「開始」および「目標」(両方とも同じ長さ)。チェーン内の隣接する単語が1文字だけ異なり、チェーン内の各単語が有効な単語、すなわち辞書内に存在するように、「開始」から「ターゲット」までの最小のチェーンの長さを見つける。 「ターゲット」という単語が辞書に存在し、すべての辞書の単語の長さが同じであると仮定することができる。

#include<bits/stdc++.h> 
using namespace std; 

string dic[] = {"POON", "PLEE", "SAME", "POIE", "PLEA", "PLIE", "POIN"}; 

int n = sizeof(dic)/sizeof(dic[0]); 

set<string> graph; 

struct word 
{ 
    string s; 
    int d; 
}; 

bool isAdj(string &s , string &t) 
{ 
    int count = 0; 

    for(int i=0; i<s.length() && i<t.length(); i++) 
     if(s[i] != t[i]) 
      count++; 

    return (count == 1);  
} 

int shortestPath(string s , string d) 
{ 
    queue<word> que; 

    word source = {s , 0}; 

    que.push(source); 

    word cur; 
    //string t = "PLEA"; 
    while(!que.empty()) 
    { 
     cur = que.front(); 
     if(cur.s == d) 
      break; 

     for(string t : graph) 
     { 
      if(isAdj(cur.s , t)) 
      { 
       word temp = {t, cur.d + 1}; 

       que.push(temp); 
       graph.erase(t); 
      } 
     } 

     que.pop(); 

    } 

    if(cur.s == d) 
     return cur.d; 
    return 0; 
} 

main() 
{ 

    for(int i=0; i<n; i++) 
     graph.insert(dic[i]); 

    cout<<" "<<shortestPath("TOON" , "PLEA") ; 
} 

質問リンクは、ここで事前に http://www.geeksforgeeks.org/word-ladder-length-of-shortest-chain-to-reach-a-target-word/

のおかげです。

+3

[列挙中に変更するコレクションに対してranged-forを使用しない](http://stackoverflow.com/questions/10360461/removing-item-from-vector-while-in-c11-range-for-ループ)。 – WhozCraig

+0

しかし、私が(auto it = graph.begin(); it!= graph.end(); it ++)を使用しても、同じランタイムエラーが発生しています。 –

+3

私は理由のためにその答えをリンクしました、そして、あなたは選択された答えを読むためにうまくいくでしょう。あなたがやっていることは*まだ*間違っています。私が投稿した質問の[選択された回答](http://stackoverflow.com/a/10360466/1322972)で、潜在的なコンテナ項目の消去とともにイテレータベースの列挙を実行する方法の*適切な例を詳しく見てください。 forループ構造にはインクリメントステートメントは存在しません。ループの* body *内に消去**または**のインクリメントがあります。より良いことに、それを「while」として再コードし、リンクされた振る舞いを模倣する。 – WhozCraig

答えて

0

コメントには大きなポイントがあります。

しかし、それは別の問題を抱えています。そのループでグラフを編集する必要はありません。

list<string> foundStrings; 
for(string t : graph) 
     { 
      if(isAdj(cur.s , t)) 
      { 
       foundStrings.push_back(t); 
      } 
     } 
for(string t: foundStrings) { 
    word temp = {t, cur.d + 1}; 
    que.push(temp); 
    graph.erase(t); 
} 

(おそらく同様に扱ういくつかの誤りがあるはずです。)

は基本的に:あなたはそれを反復処理しているときは、順序を変更している場合は、余分な事前注意を取らなければならないとC +を使用することはできません+11スタイルですが、その時点で変更しないことをお勧めします.2番目の方法は、イテレータを使用して特別な注意を払うことです。

+0

OPのコードは複数の "隣接"文字列を見つけ、それらのすべてをキューに入れます。あなたのコードは、見つかった最後の(またはブレークの最初のもの)だけを使用します。 OPの例がセットに入る順序に応じて、それは深さを見つけることができません。 – Caleth

+0

私は複数のマッチを扱う答えを変更しました。 –

関連する問題