今C#で数独の問題を作成するプログラムを作ろうと思っています。
数独についてはhttp://gdb.on.arena.ne.jp/PZ/PLACE/を見てください。
まずはhttp://gdb.on.arena.ne.jp/PZ/PLACE/のルールに反しないように
9*9マスに数字を入れるプログラムを作って見たのですが途中で止まってしまいます。
途中で止まる原因がわかる方がいましたら原因を教えて下さい。
お願いします。
using System;
class sudoku
{
Random random = new Random();
private int r;
private int i, j;
private int[,] X = new int[9, 9];
public sudoku()
{
for (i = 0; i < 9; i++)
{
for (j = 0; j < 9; j++)
{
r = random.Next(1, 10);
X[i, j] = r;
hikaku();
}
}
}
public void hikaku()
{
while (true)
{
int start1 = 0, start2 = 0, end2 = 0, shoki1, shoki2, a, b,x,y,z;
x = 0; y = 0; z = 0;
//縦についての設定
if (i == 0 || i == 1 || i == 2)
{ start1 = 0; }
if (i == 3 || i == 4 || i == 5)
{ start1 = 3; }
if (i == 6 || i == 7 || i == 8)
{ start1 = 6; }
//横についての設定
if (j == 0 || j == 1 || j == 2)
{ start2 = 0; end2 = 2; }
if (j == 3 || j == 4 || j == 5)
{ start2 = 3; end2 = 5; }
if (j == 6 || j == 7 || j == 8)
{ start2 = 6; end2 = 8; }
//ループで□内を検索
for (shoki1 = start1; shoki1 <= i; shoki1++)//縦ループ
{
for (shoki2 = start2; shoki2 <= end2; shoki2++)
{
if (i == shoki1 && j == shoki2)
{
break;
}
if (X[i, j] == X[shoki1, shoki2])
{
r = random.Next(1, 10);
X[i, j] = r;
x = 1;
}
}
}
//ここから横を比較
for (b = 0; b < j; b++)
{
if (X[i, j] == X[i, b])
{
r = random.Next(1, 10);
X[i, j] = r;
y = 1;
}
}
//ここから縦を比較
for (a = 0; a < i; a++)
{
if (X[i, j] == X[a, j])
{
r = random.Next(1, 10);
X[i, j] = r;
z = 1;
}
}
if (x == 0 && y == 0 && z == 0)
{
break;
}
}
Console.Write("{0} ", X[i, j]);//途中で止まるので何処までいったかの表示用
}
public void Write()
{
for (i = 0; i < 9; i++)
{
for (j = 0; j < 9; j++)
{
Console.Write("{0} ",X[i, j]);
}
Console.WriteLine();
}
}
static void Main()
{
sudoku S = new sudoku();
S.Write();
}
}
No.4ベストアンサー
- 回答日時:
原因判明。
例えば途中までのデータが
325618497
798245613
164397582
813962745
94278136○
となったとしよう。X[4,4]には何を入れたらよいか?
165294873
938576124
274381695
591628347
642957○××
X[6,4]に入れることが出来る数字は何?
回答有難う御座います。値を入れることが出来ない状況が発生していたわけですね。
何回か繰り返して進展がないなら一行戻ってやり直すように
書き直した所上手くいくようになりました。
これで丸一日悩んでいましたがようやく次に進めそうです。
本当に有難う御座いました。
No.2
- 回答日時:
#1のソースは読んでないけど。
途中で止まる原因についてヒント出しておくよ。
x = 1,y = 1,z = 1って3つの代入文は何のためにあるんだろうね。
「フラグ立てておいて,その地点では選出しなおさずチェックだけにしておいて,全てのチェックが終わった後にどれかが1ならば,ランダムに選びなおし」
ならわかるんだけど
「一致しなかったときランダムに選びなおしてフラグを立てる。【で元に戻さない】」の?
あと,多分選びなおした後の数字についてはチェックしてないのかな?これ。
#メソッド名が「比較」なんだから
「選びなおし」は別メソッドにしようぜ?
No.1
- 回答日時:
ええとですね。
こう言う場合は「他人が書いたソースコードを読んでみる」と言うのが一番なのです。
誰の?と思うかもしれませんが、そう言う事が可能なように「オープンソースソフトウェア」ってのがあるんですね。全てのソフトウェアのコードが商用製品みたいに「ブラックボックス」だったら誰のソースも参考に出来ませんが、そう言う「不都合を避ける」為にフリーソフトウェア運動とか、オープンソース運動、ってのがあるのです。お分かりでしょうか?
オープンソースで「数独」のソースも公開されています。ダウンロードして調べてみてください。ANSI Cで書かれている模様です。
Sudoku ホームページ:
http://www.laurasia.com.au/sudoku/
そこに「Downloads:」ってのがある筈です。一つはUnix用のSudokuのソースコード、もう一つはMicrosoft Windows用のソースとバイナリです。
ソースコードを読んで頑張って勉強してみてください。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# 大量のデータを読み込んで表示する速度を改善したい 8 2023/05/07 13:29
- Java javaでのプログラム(配列)について質問です. 2 2022/10/14 22:27
- Visual Basic(VBA) ファイル全てを .xlsm に変更したところ、プログラムが途中で落ちてしまっています 17 2022/12/07 12:03
- C言語・C++・C# プログラミングの授業の課題です 1 2023/01/17 22:15
- Ruby vscode 文字化け 1 2022/05/21 19:17
- Ruby 【JAVA】数字をひし形に出力するプログラムについて 2 2022/07/11 23:32
- C言語・C++・C# c言語の問題です 3 2023/01/10 16:15
- C言語・C++・C# バイナリファイルをコピーするのにかかる時間を測りたいのですが実行するとFatel error:gli 2 2022/11/03 01:10
- その他(プログラミング・Web制作) 十進BASICでの再帰についての質問です。 2 2022/11/18 09:17
- C言語・C++・C# プログラミング c言語 4 2023/03/07 01:05
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
ボタンの複数割り当てについて
-
C#で、あるクラスのメンバーす...
-
C#でHTTPリクエスト時にフリー...
-
Junitテストでvoid戻り値メッソ...
-
C#でのWNetAddConnection3の使...
-
C# 矢印キーの取得
-
C# visibleプロパティをfalseに...
-
JavaFXでの表内のチェックボッ...
-
C#でキーイベントが発生しない...
-
Processingでマウスクリックで...
-
大量のデータを読み込んで表示...
-
Visual C♯ フォーム間での値の...
-
ArrayListを使ったJavaコンパイ...
-
正規表現
-
Thread.sleepのInterruptedExce...
-
コンボボックスを使う時の警告
-
プログラミング(Java)じゃん...
-
javaで質問です。 文字列2023/2...
-
C言語のポインターに関する警告
-
java キーボード入力された値の...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
大量のデータを読み込んで表示...
-
ボタンの複数割り当てについて
-
C#で、あるクラスのメンバーす...
-
Junitテストでvoid戻り値メッソ...
-
C#でのWNetAddConnection3の使...
-
C# 矢印キーの取得
-
Thread.sleepのInterruptedExce...
-
unityでのC++エラーの原因がわ...
-
C#で別のFormへ複数の値を返そ...
-
C# visibleプロパティをfalseに...
-
エンターキーを押すとOKボタン...
-
Processingでマウスクリックで...
-
C#でキーイベントが発生しない...
-
[C#.net]スレッド化された別フ...
-
C# DataGridView列カスタマイズ
-
【C#】ソースコードをファイル...
-
LVM_SETITEMSTATEでListViewの...
-
GetDIBits関数の使い方について
-
未割り当てのローカル変数
-
C# MouseHoverを何度も呼ぶには
おすすめ情報