数独を解くプログラムの続きです。しても解けない問題が出てきたので質問しに来ました。現在、基本テクニック(ルールによるもの)と単独候補数字、そしてn国同盟まで作りました。現在、このn国同盟は数字が2つならでき、3つ以上となるとできません。temporaryFlag()がn国同盟のつもりです。当然ですがtemporaryFlag()の中の2を3や4にしてもできません。完全にn国同盟ができるようご指摘ください。コードを読んだだけでは何をしているのかすらわからないかと思います。遠慮なく質問なさってください。show(true,任意の値)で呼び出すと任意の値の現在のフラグの状態を表示できます。}}//このtemporaryFlagがn国同盟のつもりです。今回は私がやっときましたが、前スレと「n国同盟」とやらを説明するサイトへのリンクを貼りましょう。解法まとめそれと、現在「n国同盟」が正しく実装されたら解けると考えている問題も、ソースコードに埋め込んでもらえると、デバッグしやすいです。酒を飲み始めてしまったので、今日はここまでです。前スレとn国同盟説明のリンクは貼るべきですね。問題は以下のようになります。2↓ファイル用600080000008700001000005600840002090000803000020500084004200000500008300000010002もしかすると、n国同盟以前の問題なのかもしれませんがどのみち解けていません。前スレを読み返してみたけど、デバッグするようにさんざん指摘していますね。何より建設的ではないですか?(問題として間違っていなければ)数独が必ず解けるのと同じように、この種類の不具合は必ず原因を突き止められます。前スレを読み返してみたけど、デバッグするようにさんざん指摘していますね。この種類の不具合は必ず原因を突き止められます。しないのですか?デバッグとしてフラグの状態を表示してみましたが、何もつかめません。問題の続きは以下のようにして見つけることができることだけはわかりました。(別の方に聞きました。中段左ブロックで6が入るのはDEだけになります。従って、縦並びのFには6が入らず、Fに入るのは7と9だけとなります。Gに入るのは元々7と9だけです。下段左ブロックに注目すると、Hには1または6が入ることになります。横並びのHには6が入らないため、Hに1が確定します。-----------------------------------------------------------------ただ、上のようにしてHに1が確定することはわかりますがプログラムにできません。そもそもこの解き方はn国同盟と関係あるのでしょうか?それすらわかってません。上のようにしてHに1が確定することはわかりますがプログラムにできません。そもそもこの解き方はn国同盟と関係あるのでしょうか?それすらわかってません。何をどうデバッグして、何を見たらよいのでしょうか?Hが確定する理由は判りました。「n国同盟」という用語は定義が曖昧な印象を感じていますので、この解法が「n国同盟」なのかは判断付きません。解けなかったからといって不具合があるとは限りません。n国同盟が正しく実装できれば、「このマスのこのフラグはクリアされるはず」、というマスを探し、予想通りにクリアされるか確認しましょう。「n国同盟」の処理を終えたとき、2つめの図の状態になるはずです。このような確認をするのが「テスト」です。期待通りの結果が得られなければ、「デバッグ」して原因を見つけましょう。「n国同盟」を一旦忘れ、Hを確定する方法を実装しても良いでしょう。長い手順は分割します。横並びのCには6が入らないため、」ですので、まずはこれだけを考えましょう。横並びのCには6が入らないため、」ですので、まずはこれだけを考えましょう。できそうですか?このことだけを考え、temporaryFlag関数内に幾つか追加しました。結果からいうときちんとA,Bの6のフラグを調べた時、Cの6のフラグが折れるようになっていました。1は代入できませんでした。プログラムの改善点等々についてご指摘ください。ポイントを定義します。中段左ブロックで6が入るのはDEだけになります。従って、縦並びのFには6が入らず、Fに入るのは7と9だけとなります。中段左ブロックの6の入るマスがD・Eのみになったことから、Fから6の可能性がなくなりました。判定の原理は「Cに6が入らない」を導いたのと同じはずです。プログラムに無駄は多そうですが、できればまず完成させましょう。にっちもさっちもいかなくなったら質問してください。中段左ブロックの6の入るマスがD・Eのみになったことから、Fから6の可能性がなくなりました。このことを実装する際に大きなことに気づき、以下のように対処し、結果を得ました。・resetFlagの位置がおかしい。このままだとせっかくフラグを折っても意味がない。→結局、どこが正しいのかわからないまま。・temporaryFlagは一つのboxしか見ていない。中央右のブロックから中央左の6の可能をD,Eのみに絞ったにもかかわらず、中央左のboxを調べずに解こうとしている。→誤入力が生まれてしまった・上のままではすべてのboxを一度調べるが、一巡だとflagを折ってもそれよりも前のマスに影響されない→do~while文を使い、flagを折る限りループ→無限ループした正直、なんにも進んでおりません。上の3点について「必要ない、間違いだ」と思いましたらそうおっしゃってください。〜のように変更すべき」と思いましたらどのように変更すべきなのかヒントをください。4年前プログラムを以下のように書き換えました。させ、その上でtemporaryFlagを大幅に変更したのですが、「数独を解く」という点では全く進歩がありません。temporaryFlagをループさせることで6のフラグを折ったときのようなことを連続してできるようにし、結果的にどこかのマスのフラグを1つに絞れるつもり(今なら6より7,9。7,9より1のみになる)なのですが、代入まで持っていくことができません。プログラム、アルゴリズムに関するご指摘お待ちしております。ポイントを定義します。時間がないのでNo.10のプログラムはちゃんと見ていません。No.7のプログラムで致命的な点を2つ見つけていたのですが、どうやらそれは修正されたようですね。結果的にどこかのマスのフラグを1つに絞れるつもり(今なら6より7,9。代入まで持っていくことができません。予想と結果が違うんですよね?結果は突然湧いて出てくるわけではなく、途中経過を経て結果が導かれます。プログラムを作るときに予想していた途中経過は、どこまで予想通りでしたか?それをちゃんと確認しましょう。強力なデバッガを使うのも良いかも。Editionなどが定番です。「GとFで7と9が使われるので、下段左ブロックに注目すると、Hには1または6が入ることになります。「GとFで7と9が使われるので、同じブロックのHには7と9は入りません。返信ありがとうございます。環境についての質問にお答えします。私は学校と家とで別々の環境を使っています。10.10.3,Xcode6です。プログラムはメールで直接送っています。(_tmainやstdafx.hは随時変更してます)強力なデバッガーを使ったら?とのことですが、残念ながらデバッガーの知識を持ち合わせておりません。「GとFで7と9が使われるので、同じブロックのHには7と9は入りません。」この処理が抜けていませんか?おっしゃている通り、この処理は抜けていました。この処理の実装を含めたtemporaryFlag()を再び大幅に変更しました。結果はというと、誤入力が大幅に減りました。実際に埋めて、それが正解というのも増えていません。条件を厳しくしたからだと思います。なんとか6月中には完成させたいです。プログラム、アルゴリズムに対するご指摘よろしくお願いします。ポイントを定義します。結果はというと、誤入力が大幅に減りました。実際に埋めて、それが正解というのも増えていません。条件を厳しくしたからだと思います。なんとか6月中には完成させたいです。プログラム、アルゴリズムに対するご指摘よろしくお願いします。プログラムは書けていると思いますが、根本的な考え方が間違っていると思います。数独の解き方についてではなく、プログラムの作り方についてです。誤入力が減ったとありますが、誤入力することが一度でもあるならば、それはバグです。条件には正しい条件と間違った条件しかありません。いい塩梅の厳しさを調整するものではありません。「実装済みの方法では手詰まり」という場合だけです。おっしゃている通り、この処理は抜けていました。したら、このようなことを自分で気づけるようになりますか?私は気合で見つけたわけではありませんよ。誤入力が減っても存在する限り、バグがある。(超複雑なシステムなどはともかく)バグは1つでもあってはいけない。バグがある限り、デバッグを繰り返し、自力で間違いを見つける。人に頼ろうとし過ぎでした。本当に申し訳ありません。自力でどこまで直せるのか試してみようと思います。ミクプラは自由にリンクできます。