内容
タイトルの通りで、
プログラミングで、ある座標の周囲にある8つの点(8方位の点)をXY座標でどのように表すかという内容です。
原典はAtCoderの問題の解説です。 個人的に、解説の理解に時間を要したので、わかりやすく噛み砕いて説明しようと思います。
コード
SurroundingCoordinates.java
public class SurroundingCoordinates {
public static void main(String[] args) {
int x = 0;
int y = 0;
// (1)
int[] distances = {-1,0,1};
int size = 0;
// (2)
for(int dx : distances){
for(int dy : distances){
if(dx == 0 && dy == 0) continue;
int x2 = x + dx;
int y2 = y + dy;
size++;
//座標の出力
System.out.println("("+x2+","+y2+")");
}
}
System.out.println("size : "+size);
}
}
解説
(1) 変数の宣言
表現したい座標たちはこのようになります。
この8つの座標には見ての通り法則があり、
すべてのXY座標は以下の性質を組み合わせることで表現することができます。
中心からみてx座標が1つ左 or 等しい or 1つ右
中心からみてy座標が1つ下 or 等しい or 1つ上
SurroundingCoordinates.java
int x = 0;
int y = 0;
//中心からみて座標が1つ下 or 等しい or 1つ上
int[] distances = {-1,0,1};
(2) 処理
SurroundingCoordinates.java
for(int dx : distances){
for(int dy : distances){
if(dx == 0 && dy == 0) continue;
int x2 = x + dx;
int y2 = y + dy;
}
}
まず、中央の座標と同じ点は無視します。
SurroundingCoordinates.java
if(dx == 0 && dy == 0) continue;
そして、(1)のとおり、 x座標とy座標に加算する数の種類が3通りずつあるので 3×3 で 9通り の座標が出力されます。
3×3の場合のそれぞれについて処理を行うために、2重のfor文で処理しています。
(2) 出力
出力が(1)の画像と同じようになっていると思います。
(-1,-1)
(-1,0)
(-1,1)
(0,-1)
(0,1)
(1,-1)
(1,0)
(1,1)
size : 8
この処理を応用することで、複数の座標を処理することももちろん可能です。
参考文献
Minesweeper [AtCoder Beginner Contest 075 B] の解説 ↓