現在Javaで数独のコーディングを行っています。
数独を最短で、完全に解くことのできるコーディングを目指しております。
自分の中で考えるロジックは以下の通りです。
1、消去法を用いる。
一つのセルに対し、3×3のブロック、行、列の数字を確認し、8種類の値があれば残りの一種類を代入する。
実際このコードは完成したのですが、問題が複雑になるにつれ、解答しきれないものが出てくることに気が付きました。
この対策として、
2、背理法を用いる。
消去法⇔背理法をすべてのマスが埋まるまで、繰り返す。
この方法を用いれば、ある程度の数独は解けると考えております。
しかしながら、そのロジック(フローチャート)が実際に、コードに起こすことができず行き詰っています。
また、現在はこれが最速だと、思い込んでいますが、ほかのアルゴリズムのほうが、いいのでは?というものがあれば教えていただければ幸いです。
実際のコードはこちらです。
以前似たような質問を行っておりますが、そちらからは数個修正させていただいているので記載させていただきます。
Java
1public class sudoku { 2 static int[][] data = { 3 {0,9,0,0,0,0,0,0,8}, 4 {5,0,6,4,0,9,3,0,1}, 5 {0,7,0,1,0,0,0,0,0}, 6 {3,5,0,0,0,2,7,0,0}, 7 {0,0,0,3,0,0,0,0,0}, 8 {0,1,0,7,0,0,0,0,9}, 9 {0,8,0,5,0,0,0,0,4}, 10 {0,0,0,0,0,0,0,0,0}, 11 {0,4,7,0,0,6,9,0,0}}; 12 13 public static void main(String[] args) { 14 Sub.print(data); 15 Sub.solve(data, data); 16 Sub.print(data); 17 } 18} 19 20public class Sub extends sudoku { 21 22 public static void print(int[][] data) { 23 for(int i = 0; i < 9; i++) { 24 for(int j = 0; j < 9; j++) { 25 if(data[i][j] != 0) { 26 System.out.print(" " + data[i][j] + " "); 27 } else { 28 System.out.print("( )"); 29 } 30 } 31 System.out.println(); 32 } 33 System.out.println("---------------------------"); 34 } 35 36 public static void solve(int[][]data, int[][] field) { 37 boolean tf = false; 38 do { 39 check(data); 40 if(field == data) { 41 //背理法を用いたメソッドを作成 42 //ここでコーディング方法がわからずに困っています 43 check2(data); 44 } 45 print(data); 46 int count = 0; 47 for(int r = 0; r < 9; r++) 48 for(int c = 0; c < 9; c++) { 49 if(data[r][c] != 0) 50 count++; 51 } 52 if(count == 81) 53 tf = true; 54 } while(!(tf)); 55 } 56 57//消去法を行うメソッド 58 public static void check(int[][]data) { 59 int[][] field = data; 60 61 for(int r = 0; r < 9; r++) 62 for(int c = 0; c < 9; c++) { 63 int[] num = {0,0,0,0,0,0,0,0,0}; 64 if(data[r][c] == 0) { 65 int count = 0; 66 int key = 0; 67 int sr = r / 3; 68 int sc = c / 3; 69 for(int i = 0; i < 9; i++) {//列 70 if(data[r][i] != 0) 71 num[data[r][i] -1] = 1; 72 } 73 for(int i = 0; i < 9; i++) {//行 74 if(data[i][c] != 0) 75 num[data[i][c] -1] = 1; 76 } 77 for(int s = 3 * sr; s < 3 * sr + 3; s++) {//ブロック 78 for(int b = 3 * sc; b < 3 * sc + 3; b++) { 79 if(data[s][b] != 0) 80 num[data[s][b] -1] = 1; 81 } 82 } 83 for(int a = 0; a < 9 ; a++) { 84 if(num[a] == 1) 85 count++; 86 else 87 key = a + 1; 88 } 89 if(count == 8) { 90 field[r][c] = key; 91 solve(data, field); 92 } 93 } 94 } 95 }

回答3件
あなたの回答
tips
プレビュー