C # - вычислить сумму окружающих символов в списке строк - PullRequest
0 голосов
/ 20 октября 2018

Скажем, у меня есть 4 строки в List<string>.В качестве примера я использовал xy и z, но это мог быть любой символ.

"xyyy",
"yyyz",
"yyxz",
"yyyy"

Как бы я мог рассчитать положение окружающего Y в терминах x в этом списке строк?Так что нацельтесь на X и вычислите все точки касания Y, обратите внимание, что я хочу игнорировать z и только нацеливаться на y в этом случае.В случае x в верхней левой части было бы 3 касания точек y

Я начал перебирать строку, используя ToCharArray() и отслеживая нижнюю и верхнюю границы того, где я нахожусь в спискено это быстро становится адом рекурсии.Я ищу лучшее решение для перебора каждого списка и проверки, имеет ли он нижнюю и верхнюю границу, а затем перебирает все символы.

Для пояснений:

Позволяет увеличить первые две строкив списке

"xyyy",
"yyyz"

Мы можем ясно видеть, что x касается y вправо, по диагонали и одного под ним, что означает всего 3 касания y.

Затем мне нужно будет вывестичтобы уточнить количество раз x прикосновение к Y PER строку в списке - другими словами: на строку

Ответы [ 2 ]

0 голосов
/ 20 октября 2018

Вот грубая реализация того, что вы описали, что вы хотите.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Touching {

    class CharFinder {

        public static List<Tuple<int, int>> counted = new List<Tuple<int, int>>();

        public static void Main(string[] args) {
            getInputs(out char target, out char indexed, out List<string> lines);
            List<Tuple<int, int>> indexes = new List<Tuple<int, int>>();
            for (int i = 0; i != lines.Count; i++) {
                for (int j = 0; j != lines[i].Length; j++) {
                    if (lines[i][j] == indexed) {
                        indexes.Add(new Tuple<int, int>(i, j));
                    }
                }
            } int tCount = countNeighbor(lines, indexes[0], target);
            for (int i = 0; i != indexes.Count; i++) {
                tCount += countNeighbor(lines, indexes[i], target);
            } Console.WriteLine(tCount.ToString()); 
            Console.ReadLine();
        }

        public static int countNeighbor(List<string> grid, Tuple<int, int> ind, char target) {
            int count = 0;
            for (int i = ind.Item1 - 1; i < ind.Item1 + 2; i++) {
                if (i == -1 || i >= grid.Count) { continue; } 
                for (int j = ind.Item2 - 1; j < ind.Item2 + 2; j++) {
                    if (j == -1 || j >= grid[i].Length) { continue; }
                    if (grid[i][j] == target && !counted.Contains(new Tuple<int, int>(i, j))) { 
                        counted.Add(new Tuple<int, int>(i, j));
                        count++; 
                    }
                }
            } return count;
        }

        public static void getInputs(out char target, out char indexed, out List<string> strs) {
            int lines = 0;
            strs = new List<string>();
            while (true) {
                Console.Clear();
                Console.Write("Number of lines?: ");
                try { lines = Convert.ToInt32(Console.ReadLine()); if (lines < 1) { throw new Exception(); } break; }
                catch { Console.WriteLine("ERROR: Must be a positive integer."); Console.ReadLine(); }
            } Console.Clear();
            Console.Write("Target?: ");
            target = Console.ReadLine()[0];
            Console.Clear();
            Console.Write("Indexed?: ");
            indexed = Console.ReadLine()[0];
            for (int i = 0; i < lines; i++) {
                strs.Add(Console.ReadLine());
            }
        }
    }
}
0 голосов
/ 20 октября 2018

Если вам известна длина строки и вы знаете индекс цели (найденный путем сканирования всего массива на х, то вычислить индекс соседних квадратов тривиально

int i= //some index;
int l= //row length;
int y = i/l;//the floored quotient is the y offset
int x = i % l;//the remainder is the x offset

//Note that a negative result or a number greater than the whole array length is illegal so you have to catch that in your logic
int n= i-w;// skip a row back
int s = i+w;// skip a row forward
//if we hit the end then illegal else adjacent
int e= x+1 ==l? -1 : i+1;  
int w= x-1 <0? -1: i-1;

// Если вы не хотите преобразовывать список строк в двумерный массив, просто переходите строка за строкой, как указано выше, но y теперь просто становится индексом в вашем Lst, а x - это сканирование строки. Когда вы найдете цельсимвол его смежных значений будет:

char n = list[y-1][x];
char s = list[y+1][x];
char e = list[y][x+1];
char w = list[y][x-1];
char sw= list[y+1][x-1];
char se= list[y+1][x+1];
//etc.

Просто не забудьте проверить границы, просто catch IndexOutOfRange и продолжить цикл, чтобы избежать множества утомительной специализированной логики проверки.

Этомоя задняя часть расчетов салфеток, вы можете проверить с изображением. Также, если вы хотите диагонали, я оставлю это в качестве упражнения. Совет: используйте ту же логику с недавно созданными индексами.

Если у вас естьЗначения символов Есть множество примеров их суммирования, я полагаю, что трудной частью было нахождение смежности.

...