回答編集履歴

1

追記

2015/11/23 07:34

投稿

katoy
katoy

スコア22324

test CHANGED
@@ -145,3 +145,87 @@
145
145
  55 64 72 79 85 90 94 97 99 100
146
146
 
147
147
  ```
148
+
149
+
150
+
151
+ 追記:
152
+
153
+ v -> Ux,y) を求める方法は次のようになります。
154
+
155
+ ```ruby
156
+
157
+ def pos(v, n)
158
+
159
+ if v <= (n * n + 1) / 2
160
+
161
+ pos_0(v, n)
162
+
163
+ else
164
+
165
+ x, y = pos_0(n * n + 1 - v, n)
166
+
167
+ [n - 1 - x, n - 1 - y]
168
+
169
+ end
170
+
171
+ end
172
+
173
+
174
+
175
+ def pos_0(v, n)
176
+
177
+ z = 1 # 四角の上辺の数列の初期値
178
+
179
+ d = 1 # 四角の上辺の数列の次の項との差分
180
+
181
+ tx = 0 # 四角の上辺の位置
182
+
183
+ if v <= (n * n + 1) / 2
184
+
185
+ while z <= v
186
+
187
+ z += d
188
+
189
+ d += 1
190
+
191
+ tx += 1
192
+
193
+ end
194
+
195
+ z -= (d - 1)
196
+
197
+ x = tx - (v - z) - 1
198
+
199
+ y = v - z
200
+
201
+ [x, y]
202
+
203
+ else
204
+
205
+ fail "Bad argument v:#{v}, n:#{n}"
206
+
207
+ end
208
+
209
+ end
210
+
211
+
212
+
213
+ def gen_square(n)
214
+
215
+ ary = Array.new(n).map! { Array.new(n, 0) }
216
+
217
+ (1..n * n).each do |v|
218
+
219
+ x, y = pos(v, n)
220
+
221
+ ary[y][x] = v
222
+
223
+ end
224
+
225
+ ary
226
+
227
+ end
228
+
229
+ ```
230
+
231
+