public void Proc() { int[] inpt = Reader.ReadLine().Split(' ').Select(a => int.Parse(a)).ToArray(); int kibouCount = inpt[0]; CheckLen = inpt[1]; this.KibouList = new Kibou[kibouCount]; this.KibouMap = new int[CheckLen * 2, CheckLen * 2]; this.KibouCountMap = new int[CheckLen * 2, CheckLen * 2]; for (int i = 0; i < kibouCount; i++) { Kibou newKibou = new Kibou(Reader.ReadLine()); this.KibouList[i] = newKibou; this.KibouMap[newKibou.X, newKibou.Y]++; } for (int i = 0; i < KibouMap.GetLength(0); i++) { for (int j = 0; j < KibouMap.GetLength(0); j++) { int num = this.KibouMap[i, j]; if (i > 0) { num += this.KibouCountMap[i - 1, j]; } if (j > 0) { num += this.KibouCountMap[i, j - 1]; } if (i > 0 && j > 0) { num -= this.KibouCountMap[i - 1, j - 1]; } this.KibouCountMap[i, j] = num; } } int ans = 0; int maxIndex = KibouCountMap.GetLength(0) - 1; for (int i = 0; i <= maxIndex; i++) { for (int j = 0; j <= maxIndex; j++) { int subAns = GetBlockCount(i, j); int subX = i + CheckLen; int subY = j + CheckLen; if (subX > maxIndex) { subX -= this.KibouCountMap.GetLength(0); } if (subY > maxIndex) { subY -= this.KibouCountMap.GetLength(0); } subAns += GetBlockCount(subX, subY); ans = Math.Max(subAns, ans); } } Console.WriteLine(ans); }
private int GetBlockCount(int x, int y) { int maxIndex = KibouCountMap.GetLength(0) - 1; int toX = x + CheckLen - 1; int toY = y + CheckLen - 1; int tmp = GetItemCount(x, y, Math.Min(toX, maxIndex), Math.Min(toY, maxIndex)); if (toX > maxIndex) { int subToX = toX - maxIndex - 1; int subToY = Math.Min(toY, maxIndex); tmp += GetItemCount(0, y, subToX, subToY); } if (toY > maxIndex) { tmp += GetItemCount(x, 0, Math.Min(toX, maxIndex), toY - maxIndex - 1); } if (toX > maxIndex && toY > maxIndex) { tmp += GetItemCount(0, 0, toX - maxIndex - 1, toY - maxIndex - 1); } return(tmp); }