質問: j; } } printf("\n\nノードの列番号は %dで、その値は %.3f\n", min_index + 1, dist[max1_index][min_index]); /* 結果の出力 */ return 0; } ``` <現時点の実行結果> ``` $ ./a.out Data file name: center.txt データファイル名: center.txt 0.000 4.000 5.000 7.000 4.000 0.000 3.000 3.000 5.000 3.000 0.000 4.000 7.000 3.000 4.000 0.000 ノードの列番号は 1で、その値は 7.000 ``` <期待する結果> ``` $ ./a.out Data file name: center.txt データファイル名: center.txt 0.000 4.000 5.000 7.000 4.000 0.000 3.000 3.000 5.000 3.000 0.000 4.000 7.000 3.000 4.000 0.000 ノードの列番号は 2で、その値は 4.000 ``` 実行結果を見ていて感じたことは、左から一列目の最大値を求められていることから、あとはすべての列の最大値を求め、そのすべての列の最大値の中の最小値を求めるプログラムを作成したいのですが、どうすればいいのかがわかりませんでした。 どのように実装すればいいのでしょうか。回答よろしくお願いします。
回答: コードを書くことは簡単ですが、 それだと意味が理解できない可能性があります。 特に質問者様はおそらくコードの問題というよりもアルゴリズムができていないと見受けれます。 なのでまず質問者様がやるべきことはコードを書くことよりも頭の中でアルゴリズムをきちんと組み立てることです。 それができれば、コードに起こすことはそれほど難しくないでしょう。 逆に、アルゴリズムがわかっていない状態でただコードを提示されても理解は進みません。 なぜアルゴリズムが理解していないかと私が思ったかというと ``` int max1_index=0,max2_index=0;//各列の最大値 for (j = 0; j < nnode; j++) { for (i = 0; i < nnode; i++) { if(dist[i][j]>dist[max1_index][max2_index]){ max1_index=i; max2_index=j; } } } ``` 特にこのコードを見て > > 左から一列目の最大値を求められていることから > > > というコメントをしていらっしゃいますがまずそもそも認識が違います。 このコードはすべての数の中の最大値を求めるアルゴリズムです。 もっといえば最初に現れる最大値を求めるアルゴリズムです。 まずは今のコードが何をしているのかまずはきちんと追ってみましょう。 2次元配列を繰り返している部分はいったん省いて以下だけピンポイントに絞ると ``` if(dist[i][j]>dist[max1_index][max2_index]){ max1_index=i; max2_index=j; } ``` max1_index及びmax2_indexに保存しているデータよりijのデータが大きければ max1_index及びmax2_indexをijに更新するというアルゴリズムです。 これを現実世界に置き換えると 手元でメモした数字より列から持ってきた数字のほうが大きければメモを書き換えています。 しかもメモしている数字は一つだけです。 つまりはすべての数字をチェックして最も大きな数字を一つ持ってくることになります。 ちょいと厳しいですがここが理解できないと次に進めないのでぜひ頑張ってみてください。 理解できた場合は次に進みます。 さて本当にやらなきゃいけないことは何かというと各列の大きな数字を持ってくる必要がありますね。 今はメモが一つだけなので一つしか保存できません。つまりメモを各列分用意します。 1列目の最大値のメモ,2列目の最大値のメモ,・・・nnode列目の最大値のメモ つまりこれも配列でメモを用意するとよいかもしれないですね。nnode分です。 列を回しながらその列の最大値を該当のN列目の最大値のメモに配列にデータを入れていきます。 次に各列の最大値の中の最小値の求め方ですが、 もう各列のnnode個の最大値のメモの配列があるので ほとんどできているようなもんですね。そのメモの配列を全部確認して最小の値を求めてみてください。 なかなか遠回りの回答ですが、ぜひ理解してご自身で解いてみてください。