ファイブマン さんが書きました:searchにおいて,i,jのループをして,S[j]が1のときを見つけた時は1を返して,1がなくなるまでループさせたいのですがこの場合,S[j] == 1は作業2の部分で-1にするので値を返る必要はないのでしょうか.そうしてこのまま実行すると無限ループが起きてしまいます.どのようにすればこの状況を回避できるのでしょうか.
無限ループに陥ることはありません。
この二つのfor文には上限が決まっていますおり、S[0][0]からS[7][8]までです。
それまでに1が一つでもあれば1が、一つもなければ0が返ります。
この関数は、「まだ有効な探査対象が残ってるよ~」ということを教えるという役割です。
もしすべて1以外(-1など)になっていたとしたら0(偽)を返します。これは「有効な探査対象はもうないよ」ということを意味します。
ですのでmainでは「有効な探査対象が残っている」間、つまりこの関数が1を返している間調べます。
iは直前で別の目的に使われてから変更されていないのでSminに用いるのは適切ではありません。
コードで言うと次のようにすれば良いです。 Smin_countを用いる理由は3において何度も重みが最小となるSを調べその値を保存していくのですが、その際にSminの添え字をずらしていくためです。
+----+
|Smin|
+----+--------------------+
| 0 | 1 | 2 | 3 | ... | 7 |
+-------------------------+-----------------------------+
|↑最初に最小の重みとなるSの添え字を入れる | // 1回目(Smin_count = 0よってS[0]に代入、Smin_count++でSmin_count = 1に)
| ↑二番目に最小の重みとなるSの添え字を入れる | // 2回目(Smin_count = 1よってS[1]に代入、Smin_count++でSmin_count = 2に)
| ↑三番目に最小の重みとなるSの添え字を入れる | // 3回目(Smin_count = 2よってS[2]に代入、Smin_count++でSmin_count = 3に)
| ↑四番目に最小の重みとなるSの添え字を入れる| // 4回目(Smin_count = 3よってS[3]に代入、Smin_count++でSmin_count = 4に)
| ↑... |
+-------------------------------------------------------+
また、Smin[Smin_count]=nとするとまだ代入がされていない所に、うまくnが代入されます。
それから、Sminに入れられている有効な値の個数とSmin_countの値が等しいことから
for (i = 0; i < Smin_count; i++)
とすれば、Sminにある有効な値を調べたいを調べられます。
これも比較的よくあるテクニックかと思います。