質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Q&A

解決済

1回答

1307閲覧

ArrayListでスタックを再現しそれを利用してナンバープレースを解く

chibi_96_

総合スコア8

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

0グッド

0クリップ

投稿2018/11/17 16:36

編集2018/11/17 18:18

ヒントの与えられたナンバープレースを解くjavaのプログラムを作成したいです。

java

1package j3.lesson06; 2 3import java.util.ArrayList; 4 5class NPState { 6 7 int position; 8 int number; 9 10 NPState(int position, int number) { 11 this.position = position; 12 this.number = number; 13 } 14 15} 16 17class StackNumberPlace { 18 19 boolean[][] hintFlags; 20 int[][] cells; 21 22 23 StackNumberPlace(String hintText) { 24 String[] t = hintText.split(","); 25 cells = new int[9][9]; 26 hintFlags = new boolean[9][9]; 27 for (int y = 0; y < 9; y++) { 28 for (int x = 0; x < 9; x++) { 29 int c = Integer.parseInt("" + t[y].charAt(x)); 30 hintFlags[x][y] = c > 0; 31 cells[x][y] = c; 32 } 33 } 34 cells1dCopy = new int[9]; 35 } 36 37 boolean checkConsistencySub(int[] cells1d) { 38 // BEGIN 39 int num=0; 40 for(int j=0;j<9;j++){ 41 num=cells1d[j]; 42 if(num!=0){ 43 for(int i=0;i<9;i++){ 44 if(i!=j){ 45 if(num==cells1d[i]){ 46 return false; 47 } 48 } 49 } 50 } 51 } 52 return true; 53 // END 54 } 55 56 boolean checkConsistency(int x, int y) { 57 // BEGIN 58 int[] xx=new int[9]; 59 int[] yy=new int[9]; 60 int[] cells2=new int[9]; 61 for(int i=0;i<9;i++){ 62 xx[i]=cells[i][y]; 63 yy[i]=cells[x][i]; 64 } 65 int x1=0,x2=3,x3=6; 66 int y1=0,y2=3,y3=6; 67 for(int i=0;i<9;i++){ 68 if(x>=0&&x<=2&&y>=0&&y<=2){ 69 cells2[i]=cells[x1][y1]; 70 x1++; 71 if(i%3==2){ 72 x1=0; 73 y1++; 74 } 75 }else if(x>=3&&x<=5&&y>=0&&y<=3){ 76 cells2[i]=cells[x2][y1]; 77 x2++; 78 if(i%3==2){ 79 x2=3; 80 y1++; 81 } 82 }else if(x>=6&&x<=8&&y>=6&&y<=8){ 83 cells2[i]=cells[x3][y1]; 84 x3++; 85 if(i%3==2){ 86 x3=6; 87 y1++; 88 } 89 }else if(x>=0&&x<=2&&y>=3&&y<=5){ 90 cells2[i]=cells[x1][y2]; 91 x1++; 92 if(i%3==2){ 93 x1=0; 94 y2++; 95 } 96 }else if(x>=3&&x<=5&&y>=3&&y<=5){ 97 cells2[i]=cells[x2][y2]; 98 x2++; 99 if(i%3==2){ 100 x2=3; 101 y2++; 102 } 103 }else if(x>=6&&x<=8&&y>=3&&y<=5){ 104 cells2[i]=cells[x3][y2]; 105 x3++; 106 if(i%3==2){ 107 x3=6; 108 y2++; 109 } 110 }else if(x>=0&&x<=2&&y>=6&&y<=8){ 111 cells2[i]=cells[x1][y3]; 112 x1++; 113 if(i%3==2){ 114 x1=0; 115 y3++; 116 } 117 }else if(x>=3&&x<=5&&y>=6&&y<=8){ 118 cells2[i]=cells[x2][y3]; 119 x2++; 120 if(i%3==2){ 121 x2=3; 122 y3++; 123 } 124 }else if(x>=6&&x<=8&&y>=6&&y<=8){ 125 cells2[i]=cells[x3][y3]; 126 x3++; 127 if(i%3==2){ 128 x3=6; 129 y3++; 130 } 131 } 132 133 134 } 135 if(checkConsistencySub(xx)&&checkConsistencySub(yy)&&checkConsistencySub(cells2)){ 136 return true; 137 } 138 return false; 139 // END 140 } 141 142 boolean solve() { 143 // BEGIN 144 ArrayList<NPState>stack =new ArrayList<NPState>(); 145 stack.add(new NPState(-1,0)); 146 while(!stack.isEmpty()){ 147 NPState state=stack.remove(stack.size()-1); 148 if(state.position>=0){ 149 int xx=state.position%9; 150 int yy=state.position/9; 151 cells[xx][yy]=state.number; 152 } 153 int position=state.position+1; 154 if(position>=81){ 155 return true; 156 } 157 int x=position%9; 158 int y=position/9; 159 for(int i=0;i<9;i++){ 160 for(int j=0;j<9;j++){ 161 if(hintFlags[i][j]==false){ 162 //cells[i][j]=0; 163 } 164 } 165 } 166 if(hintFlags[x][y]==false){ 167 for(int i=1;i<10;i++){ 168 cells[x][y]=i; 169 if(checkConsistency(x,y)==true){ 170 stack.add(new NPState(position,i)); 171 } 172 cells[x][y]=0; 173 } 174 //stack.add(new NPState(position,0)); 175 }else if(hintFlags[x][y]==true){ 176 stack.add(new NPState(position,cells[x][y])); 177 } 178 179 } 180 181 // END 182 return false; 183 } 184 185 void print() { 186 for (int y = 0; y < 9; y++) { 187 System.out.print(" "); 188 for (int x = 0; x < 9; x++) { 189 int c = cells[x][y]; 190 System.out.print(c == 0 ? ". " : c + " "); 191 if (x == 2 || x == 5) { 192 System.out.print("| "); 193 } 194 } 195 System.out.println(); 196 if (y == 2 || y == 5) { 197 System.out.println("-------+-------+-------"); 198 } 199 } 200 } 201 202 public static void main(String[] args) { 203 StackNumberPlace np = new StackNumberPlace(args[0]); 204 if (np.solve()) { 205 np.print(); 206 } 207 } 208 209} 210//530070000,600195000,098000060,800060003,400803001,700020006,060000280,000419005,000080079 211//ヒントとなる引数

checkConsistencyで同じ値が縦と横と自分が属している場所にないかを判定しています
cells[][]はナンバープレースを表しています
solveを書き換えてナンバープレースを解きたいと考えています
空いている升目に入りうる値をスタックにためておき、whileで戻った時にcellsに値を入れていくように考えました
もし、入りうる値がなかったときは前にcellsに戻りスタックにためた値を取り出して入れていきます
考えた通りに書いたつもりなのですがうまく出力してくれませんでした
ご教授のほどよろしくお願いします

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

swordone

2018/11/17 17:00

「ナンバープレース」でなくて?
chibi_96_

2018/11/17 18:19

それでした、教養がなくてお恥ずかしいです...
yukkuri

2018/11/21 09:38

すいません、cells1dCopy変数はどこですか。
guest

回答1

0

自己解決

java

1package j3.lesson06; 2 3import java.util.ArrayList; 4 5class NPState { 6 7 int position; 8 int number; 9 10 NPState(int position, int number) { 11 this.position = position; 12 this.number = number; 13 } 14 15} 16 17class StackNumberPlace { 18 19 boolean[][] hintFlags; 20 int[][] cells; 21 int[] cells1dCopy; 22 23 StackNumberPlace(String hintText) { 24 String[] t = hintText.split(","); 25 cells = new int[9][9]; 26 hintFlags = new boolean[9][9]; 27 for (int y = 0; y < 9; y++) { 28 for (int x = 0; x < 9; x++) { 29 int c = Integer.parseInt("" + t[y].charAt(x)); 30 hintFlags[x][y] = c > 0; 31 cells[x][y] = c; 32 } 33 } 34 cells1dCopy = new int[9]; 35 } 36 37 boolean checkConsistencySub(int[] cells1d) { 38 // BEGIN 39 int num=0; 40 for(int j=0;j<9;j++){ 41 num=cells1d[j]; 42 if(num!=0){ 43 for(int i=0;i<9;i++){ 44 if(i!=j){ 45 if(num==cells1d[i]){ 46 return false; 47 } 48 } 49 } 50 } 51 } 52 return true; // 書き換えてよい 53 // END 54 } 55 56 boolean checkConsistency(int x, int y) { 57 // BEGIN 58 int[] xx=new int[9]; 59 int[] yy=new int[9]; 60 int[] cells2=new int[9]; 61 for(int i=0;i<9;i++){ 62 xx[i]=cells[i][y]; 63 yy[i]=cells[x][i]; 64 } 65 int x1=0,x2=3,x3=6; 66 int y1=0,y2=3,y3=6; 67 for(int i=0;i<9;i++){ 68 if(x>=0&&x<=2&&y>=0&&y<=2){ 69 cells2[i]=cells[x1][y1]; 70 x1++; 71 if(i%3==2){ 72 x1=0; 73 y1++; 74 } 75 }else if(x>=3&&x<=5&&y>=0&&y<=3){ 76 cells2[i]=cells[x2][y1]; 77 x2++; 78 if(i%3==2){ 79 x2=3; 80 y1++; 81 } 82 }else if(x>=6&&x<=8&&y>=6&&y<=8){ 83 cells2[i]=cells[x3][y1]; 84 x3++; 85 if(i%3==2){ 86 x3=6; 87 y1++; 88 } 89 }else if(x>=0&&x<=2&&y>=3&&y<=5){ 90 cells2[i]=cells[x1][y2]; 91 x1++; 92 if(i%3==2){ 93 x1=0; 94 y2++; 95 } 96 }else if(x>=3&&x<=5&&y>=3&&y<=5){ 97 cells2[i]=cells[x2][y2]; 98 x2++; 99 if(i%3==2){ 100 x2=3; 101 y2++; 102 } 103 }else if(x>=6&&x<=8&&y>=3&&y<=5){ 104 cells2[i]=cells[x3][y2]; 105 x3++; 106 if(i%3==2){ 107 x3=6; 108 y2++; 109 } 110 }else if(x>=0&&x<=2&&y>=6&&y<=8){ 111 cells2[i]=cells[x1][y3]; 112 x1++; 113 if(i%3==2){ 114 x1=0; 115 y3++; 116 } 117 }else if(x>=3&&x<=5&&y>=6&&y<=8){ 118 cells2[i]=cells[x2][y3]; 119 x2++; 120 if(i%3==2){ 121 x2=3; 122 y3++; 123 } 124 }else if(x>=6&&x<=8&&y>=6&&y<=8){ 125 cells2[i]=cells[x3][y3]; 126 x3++; 127 if(i%3==2){ 128 x3=6; 129 y3++; 130 } 131 } 132 133 134 } 135 if(checkConsistencySub(xx)&&checkConsistencySub(yy)&&checkConsistencySub(cells2)){ 136 return true; 137 } 138 return false; // 書き換えてよい 139 // END 140 } 141 142 boolean solve() { 143 // BEGIN 144 ArrayList<NPState>stack =new ArrayList<NPState>(); 145 stack.add(new NPState(-1,0)); 146 while(!stack.isEmpty()){ 147 NPState state=stack.remove(stack.size()-1); 148 int xx=state.position%9; 149 int yy=state.position/9; 150 if(state.position>=0){ 151 cells[xx][yy]=state.number; 152 } 153 int position=state.position+1; 154 if(position==81){ 155 return true; 156 } 157 int x=position%9; 158 int y=position/9; 159 160 if(hintFlags[x][y]==false){ 161 for(int i=1;i<10;i++){ 162 cells[x][y]=i; 163 if(checkConsistency(x,y)==true){ 164 stack.add(new NPState(position,i)); 165 } 166 } 167 }else{ 168 if(checkConsistency(x,y)){ 169 stack.add(new NPState(position,cells[x][y])); 170 } 171 } 172 for(int i=stack.get(stack.size()-1).position;i<=position;i++){ 173 if(hintFlags[i%9][i/9]==false){ 174 cells[i%9][i/9]=0; 175 } 176 } 177 } 178 179 180 // END 181 return false; 182 } 183 184 void print() { 185 for (int y = 0; y < 9; y++) { 186 System.out.print(" "); 187 for (int x = 0; x < 9; x++) { 188 int c = cells[x][y]; 189 System.out.print(c == 0 ? ". " : c + " "); 190 if (x == 2 || x == 5) { 191 System.out.print("| "); 192 } 193 } 194 System.out.println(); 195 if (y == 2 || y == 5) { 196 System.out.println("-------+-------+-------"); 197 } 198 } 199 } 200 201 public static void main(String[] args) { 202 StackNumberPlace np = new StackNumberPlace(args[0]); 203 if (np.solve()) { 204 np.print(); 205 } 206 } 207 208} 209

ダメだった時に0に現在から先頭のスタックのポジションまで0にすることでうまく動作しました。。
質問の不備が多くてすいませんでした...

投稿2018/11/23 06:41

chibi_96_

総合スコア8

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問