- ベストアンサー
三色色塗り問題を解くための簡単なソースコードと説明
- 三色色塗り問題を解くための簡単なソースコードと、その説明を紹介します。
- 条件は、6つのノードと3つの色があり、接続がつながっているノード同士は同じ色になってはいけません。
- 初心者でも理解しやすいように、ソースコードを提供しますので、参考にしてください。
- みんなの回答 (1)
- 専門家の回答
質問者が選んだベストアンサー
いろんなやり方があるけど、初心者向きにわかりやすさを重視するなら再帰をつかうのがいいでしょう。 int a[MAX_NODE]; // ノードの色が入る配列 bool check_link(int n) { // n個目までのノードの色がa[]に入っている時、そこまでリンクのあるノードに同じものがないかをチェックする関数 // 違反がなければ true、あれば false、n < 2 の時は常に true // この関数ぐらいは自分で書けるでしょ } bool aaa(int n) { int i; if(check_link(n) == false) { // チェックがfalseなら失敗なので、戻る return false; } // ここまで n個目までは違反がないことがわかった if(n >= MAX_NODE) { // n >= MAX_NODE なら答えは a[] に完成している return true; } for(i = 0; i < 3; i++) { // n+1個目の色を順番に試す a[n] = i; if(aaa(n + 1) == true) { // 正解が見つかった return true; } } return false; } これで aaa(0); を呼び出して true が返ってきたら答えは a[] に完成しているし、false なら解は存在しない。 ただし、上の方法はあくまでも原理を記述したもので、ノード数が多くてリンクもたくさんなら 解を得るまでの時間を短縮するためにいろいろ工夫が必要になるでしょう。 たとえば check_link(n)は、一つ前(n-1)までは真であることが確認済みと仮定するとか。
補足
moritan2さん、 //n個目までのノードの色がa[]に入っている時、そこまでリンクのあるノードに同じものがないかをチェックする関数 // 違反がなければ true、あれば false、n < 2 の時は常に true // この関数ぐらいは自分で書けるでしょ のところも教えていただけないでしょうか? できもしないのに手を出してしまって、困っています。提出しなければいけない状況なんで、もし差し支えなければよろしくお願いします。