回答編集履歴

4

修正

2017/07/04 17:57

投稿

kiichi54321
kiichi54321

スコア1984

test CHANGED
@@ -1,4 +1,6 @@
1
1
  もともとのプログラムは、いって、もどって、いってを繰り返し、値が求まらない。
2
+
3
+ いわゆる無限ループになっている。
2
4
 
3
5
  調べたところは戻らない。一方向にするというようにするために、
4
6
 
@@ -17,8 +19,6 @@
17
19
  Dictionary<(int, int), bool> imageData = new Dictionary<(int, int), bool>();
18
20
 
19
21
 
20
-
21
- Dictionary<(int, int), bool> imageData = new Dictionary<(int, int), bool>();
22
22
 
23
23
  public int 連続を求める(int p_x,int p_y)
24
24
 

3

リファクタ

2017/07/04 17:56

投稿

kiichi54321
kiichi54321

スコア1984

test CHANGED
@@ -18,7 +18,9 @@
18
18
 
19
19
 
20
20
 
21
+ Dictionary<(int, int), bool> imageData = new Dictionary<(int, int), bool>();
22
+
21
- public int 連続を求める(int p_x,int p_y)
23
+ public int 連続を求める(int p_x,int p_y)
22
24
 
23
25
  {
24
26
 
@@ -27,6 +29,28 @@
27
29
  Stack<(int, int)> stack = new Stack<(int, int)>();
28
30
 
29
31
 
32
+
33
+ IEnumerable<(int,int)> 周辺の座標(int x,int y)
34
+
35
+ {
36
+
37
+ for (int i = -1; i <= 1; i++)
38
+
39
+ {
40
+
41
+ for (int l = -1; l <= 1; l++)
42
+
43
+ {
44
+
45
+ yield return (x + i, y + l);
46
+
47
+ }
48
+
49
+ }
50
+
51
+ }
52
+
53
+
30
54
 
31
55
  void Check(int x,int y)
32
56
 
@@ -42,19 +66,19 @@
42
66
 
43
67
  historyList.Add((x, y));
44
68
 
45
- for (int i = -1; i <= 1; i++)
69
+ foreach (var item in 周辺の座標( x, y))
46
70
 
47
71
  {
48
72
 
49
- for (int l = -1; l <= 1; l++)
73
+ if (historyList.Contains(item) == false)
50
74
 
51
75
  {
52
76
 
53
- if (historyList.Contains((x + i, y + l)) == false) stack.Push((x + i, y + l));
77
+ stack.Push(item);
54
78
 
55
79
  }
56
80
 
57
- }
81
+ }
58
82
 
59
83
  }
60
84
 
@@ -62,7 +86,7 @@
62
86
 
63
87
  }
64
88
 
65
-       //初期値をいれる
89
+ //開始地点の入力
66
90
 
67
91
  stack.Push((p_x, p_y));
68
92
 
@@ -83,5 +107,3 @@
83
107
  ```
84
108
 
85
109
 
86
-
87
- ソース読み直したら、わざわざローカル関数を使わなくてもよかった・・・まぁいいか。

2

修正

2017/07/04 17:55

投稿

kiichi54321
kiichi54321

スコア1984

test CHANGED
@@ -1,3 +1,7 @@
1
+ もともとのプログラムは、いって、もどって、いってを繰り返し、値が求まらない。
2
+
3
+ 調べたところは戻らない。一方向にするというようにするために、
4
+
1
5
  たどっていった履歴を残すことで、数え上げる。最後は、たどった履歴を数える。
2
6
 
3
7
  C#7.0のローカル関数も使っています。

1

修正

2017/07/04 16:32

投稿

kiichi54321
kiichi54321

スコア1984

test CHANGED
@@ -58,6 +58,8 @@
58
58
 
59
59
  }
60
60
 
61
+       //初期値をいれる
62
+
61
63
  stack.Push((p_x, p_y));
62
64
 
63
65
  while(stack.Count>0)
@@ -75,3 +77,7 @@
75
77
  }
76
78
 
77
79
  ```
80
+
81
+
82
+
83
+ ソース読み直したら、わざわざローカル関数を使わなくてもよかった・・・まぁいいか。