回答編集履歴

4

別解の変更

2020/07/02 16:39

投稿

kazuma-s
kazuma-s

スコア8224

test CHANGED
@@ -240,18 +240,34 @@
240
240
 
241
241
  ```
242
242
 
243
+ **追記2**
244
+
245
+ can_choose の 3番目の for文が間違っていました。
246
+
247
+ 次のように訂正します。
248
+
249
+
250
+
251
+ ```diff
252
+
253
+ - for (x = j - 1, y = i + 1; x >= 0 && y < N; x--, y++)
254
+
255
+ + for (x = i - 1, y = j + 1; x >= 0 && y < N; x--, y++)
256
+
257
+ ```
258
+
243
259
  **追記3**
244
260
 
245
- can_choose の 3番目の for文が間違ていました
261
+ 別解の can_choose をちょと変更
246
-
247
- 次のように訂正します。
248
-
249
-
250
262
 
251
263
  ```diff
252
264
 
253
- - for (x = j - 1, y = i + 1; x >= 0 && y < N; x--, y++)
265
+ - for (int i = x - 1, p = 1; i >= 0; i--, p++)
266
+
254
-
267
+ - if (a[i] == y || a[i] - p == y || a[i] + p == y) return 0;
268
+
269
+ + for (int p = 1; --x >= 0; p++)
270
+
255
- + for (x = i - 1, y = j + 1; x >= 0 && y < N; x--, y++)
271
+ + if (a[x] == y || a[x] - p == y || a[x] + p == y) return 0;
256
-
272
+
257
- ```
273
+ ```

3

コードの訂正

2020/07/02 16:39

投稿

kazuma-s
kazuma-s

スコア8224

test CHANGED
@@ -239,3 +239,19 @@
239
239
  }
240
240
 
241
241
  ```
242
+
243
+ **追記3**
244
+
245
+ can_choose の 3番目の for文が間違っていました。
246
+
247
+ 次のように訂正します。
248
+
249
+
250
+
251
+ ```diff
252
+
253
+ - for (x = j - 1, y = i + 1; x >= 0 && y < N; x--, y++)
254
+
255
+ + for (x = i - 1, y = j + 1; x >= 0 && y < N; x--, y++)
256
+
257
+ ```

2

別解

2020/07/02 12:14

投稿

kazuma-s
kazuma-s

スコア8224

test CHANGED
@@ -135,3 +135,107 @@
135
135
  }
136
136
 
137
137
  ```
138
+
139
+ **追記**
140
+
141
+ 別解を考えて書いてみたら、92個のパターンが出てきました。
142
+
143
+ ところが、最初のコードは、650個出てきて間違ったものが含まれています。
144
+
145
+ どこが間違っているのか調査したいんですが、ちょっと別件の用事があって
146
+
147
+ しばらく時間をください。
148
+
149
+
150
+
151
+ 別解
152
+
153
+ ```C
154
+
155
+ #include <stdio.h>
156
+
157
+
158
+
159
+ #define N 8
160
+
161
+
162
+
163
+ void output(int a[])
164
+
165
+ {
166
+
167
+ for (int i = 0; i < N; i++) {
168
+
169
+ for (int j = 1; j <= N; j++) {
170
+
171
+ if (a[i] == j) printf(" Q");
172
+
173
+ else printf(" *");
174
+
175
+ }
176
+
177
+ putchar('\n');
178
+
179
+ }
180
+
181
+ putchar('\n');
182
+
183
+ }
184
+
185
+
186
+
187
+ int can_choose(int a[], int x, int y)
188
+
189
+ {
190
+
191
+ for (int i = x - 1, p = 1; i >= 0; i--, p++)
192
+
193
+ if (a[i] == y || a[i] - p == y || a[i] + p == y) return 0;
194
+
195
+ return 1;
196
+
197
+ }
198
+
199
+
200
+
201
+ void solve(int board[], int x)
202
+
203
+ {
204
+
205
+ if (x == N)
206
+
207
+ output(board);
208
+
209
+ else {
210
+
211
+ for (int y = 1; y <= N; y++) {
212
+
213
+ if (can_choose(board, x, y)) {
214
+
215
+ board[x] = y;
216
+
217
+ solve(board, x + 1);
218
+
219
+ board[x] = 0;
220
+
221
+ }
222
+
223
+ }
224
+
225
+ }
226
+
227
+ }
228
+
229
+
230
+
231
+ int main(void)
232
+
233
+ {
234
+
235
+ int board[N] = { 0 };
236
+
237
+ solve(board, 0);
238
+
239
+ }
240
+
241
+ ```

1

語句修正

2020/07/02 08:51

投稿

kazuma-s
kazuma-s

スコア8224

test CHANGED
@@ -1,6 +1,6 @@
1
- main では a[x][y]、can_choose は a[y][x] になっています。
1
+ main では a[x][y]、can_choose は a[y][x] になっています。
2
2
 
3
- can_choose の 3つめの y<0 は常に成立しません。
3
+ can_choose の 3つめの for文の y<0 は常に成立しません。
4
4
 
5
5
  solve も変です。boad[x][y] = queen; はしているのに、
6
6