- ベストアンサー
2次元配列のソートについて
- 四角形を分割し、辺に番号をつけるアルゴリズムを考えていますが、重なりが問題となっています
- 重なる四角形の番号を書き換えることで解決しようとしていますが、どうすればよいか分かりません
- 詳しい方からの回答をお待ちしています
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
これでどうかな //※以下、N は線分の総数 #define no 0 #define INVALID -1//無効値 int count;//通し番号(線分につける番号) int s, t; //各線分に割り振られている通し番号を「無効値」で初期化 for(t=0;t<N;t++){ data[t][no] = INVALID; } count = 0;//通し番号を初期化 /*以下の2重ループにおいて、 外ループで基準線分data[t][]を決定し、 そのそれぞれに対して 内ループで副線分data[s][]を決定し、 かつ基準線分と副線分を比較する。 */ for(t=0;t<N;t++){//←tの範囲に注意 //基準線分の通し番号が既に決定してるなら、 //以後の処理を行わずループ先頭に返る if (data[t][no] != INVALID) { continue; } //基準線分に対し、「(正しい)通し番号」を割り振る data[t][no] = ++count; //内側ループ(副線分処理) for(s=t+1;s<N;s++){ if (data[s][no] != INVALID) { continue; } //もし基準線分と副線分が一致するなら //副線分に対し通し番号を割り振る if((data[s][x1]==data[t][x1]) &&(data[s][y1]==data[t][y1]) &&(data[s][x2]==data[t][x2]) &&(data[s][y2]==data[t][y2])){ //通し番号わりふり data[s][no]=count; //break;//←不要 } } }
その他の回答 (1)
- Tacosan
- ベストアンサー率23% (3656/15482)
どうされたいのかよくわからないのですが, 数字がとんでもいいのでとにかく 全ての辺に数字を割り振っておき, そのあとで割り振った数字を変更するという 方針ではダメでしょうか?
補足
早速の回答ありがとうございます。その方針で進めているのですが、変更を2回行う事になると思うんです。。。 例えば1~10まで最初に番号を振り、2と8,3と7のデータが同じだった場合、 1.2.3.4.5.6.3.2.9.10と並ぶと思いますが、 1.2.3.4.5.6.3.2.7.8と並べたいのです。 1回目の変更は上に書いてあるプログラムで、もし、同じデータが出てきた場合、前に使った番号(今回だと7=3,8=2)を使うように指示し、それはうまくいきました。 次に9の所をまだ使っていない番号7に置き換えそれ以降も8.9.10と振っていきたいのですが、それがうまくいきません。今の段階では、 上記の最初の方、 1.2.3.4.5.6.3.2.9.10となってしまうのです・・・。