teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

2

リファクタ

2017/07/04 14:36

投稿

kiichi54321
kiichi54321

スコア1986

answer CHANGED
@@ -11,20 +11,17 @@
11
11
  if (dic.ContainKey((x,y)) return dic[(x,y)];
12
12
  if (x < width && x >= 0 && y < height && y >= 0)
13
13
  {
14
+ var result = 1;
14
- if (img.GetPixel(x, y) == Black)
15
+ if (img.GetPixel(x, y) != Black)
15
16
  {
16
- dic.Add((x,y),1);
17
- return 1;
18
- }
19
- else
20
- {
21
17
  img.SetPixel(x, y, Black);
22
- var result = (Expansion(y + 1, x) + Expansion(y - 1, x) +
18
+ result = (Expansion(y + 1, x) + Expansion(y - 1, x) +
23
19
  Expansion(y + 1, x + 1) + Expansion(y - 1, x + 1) +
24
20
  Expansion(y + 1, x - 1) + Expansion(y - 1, x - 1) +
25
21
  Expansion(y, x + 1) + Expansion(y, x - 1));
26
- dic.Add((x,y),result);
27
22
  }
23
+ dic.Add((x,y),result);
24
+ return result;
28
25
  }
29
26
  else return 1;
30
27
  }

1

修正

2017/07/04 14:36

投稿

kiichi54321
kiichi54321

スコア1986

answer CHANGED
@@ -1,6 +1,8 @@
1
1
  Expansionを呼び出し過ぎなので、メモ化、Dictionaryにxy座標に対する結果を格納するとかするといいのでは?
2
+ 何度も同じ再帰を繰り返してしまうため、計算が無駄です。
2
3
  動的計画法とかを勉強してみるといいと思います。
3
4
 
5
+
4
6
  ```ここに言語を入力
5
7
  Dictonary<(int,int),int> dic = new Dictonary<(int,int),int>()
6
8
  int Expansion(int y, int x)
@@ -26,4 +28,6 @@
26
28
  }
27
29
  else return 1;
28
30
  }
29
- ```
31
+ ```
32
+
33
+ これなら座標分の計算しかしないので、スタックとかはとりあえず必要ないんじゃないかなぁ。