如何通过字典的键

时间:2017-06-26 14:43:28

标签: c# algorithm list dictionary

这个有点长,所以如果你不认为你需要上下文来回答,我会把问题放在最底层。

我需要计算哪个(国际象棋)骑士在一个只有骑士的板上攻击其他骑士,并移除尽可能少的骑士,以便没有人互相攻击。

输入:

5
OKOKO
KOOOK
OOKOO
KOOOK
OKOKO 

第一个数字是棋盘的大小(行和列),'空空间','K'骑士。

所以我的想法是通过矩阵中的一个循环(我希望它尽可能快)来保存骑士的位置以及他在列表中踩到的所有骑士的位置,像这样的字典(字符串将是由空格分隔的索引):

Dictionary<string, List<string>> knightsAttacks = new Dictionary<string, List<string>>(); 这样我就可以计算列表中元素的数量,然后删除列表中索引最多的元素,之后我删除,这个骑士索引来自所有其他骑士列表,如果所有骑士的所有列表都是空的意思是没有骑士互相干扰。在上面给出的这个例子中,字典看起来像这样: enter image description here 选定的骑士是计数最多的骑士(大多数命中),所以我需要从其他骑士名单中删除他和他的索引(“2 2”)。 一切都很好,理论上很好,但我不能执行从列表部分删除。 这是我到目前为止编写的代码:

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

namespace Practice
{
    class Program
    {
        static void Main(string[] args)
        {


            int n = int.Parse(Console.ReadLine());
            char[,] board = new char[n, n];

            Dictionary<string, List<string>> knightsAttacks = new Dictionary<string, List<string>>();
            for (int i = 0; i < n; i++)
            {
                char[] line = Console.ReadLine().ToCharArray();
                for (int j = 0; j < n; j++)
                {
                    board[i, j] = line[j];
                }
            }
            for (int i = 0; i < n; i++)
            {
                for (int j = 0; j < n; j++)
                {
                    List<string> list = new List<string>();
                    bool checker = false;
                    int x1 = i + 1, y1 = j + 2;
                    int x2 = i + 1, y2 = j - 2;
                    int x3 = i - 1, y3 = j + 2;
                    int x4 = i - 1, y4 = j - 2;

                    int x5 = i - 2, y5 = j + 1;
                    int x6 = i - 2, y6 = j - 1;
                    int x7 = i + 2, y7 = j + 1;
                    int x8 = i + 2, y8 = j - 1;
                    if (board[i, j] == 'K')
                    {
                        try
                        {
                            if (board[i, j] == board[x1, y1])
                            {

                                list.Add($"{x1} {y1}");
                                checker = true;
                            }
                        }
                        catch (Exception e)
                        {
                        }
                        try
                        {
                            if (board[i, j] == board[x2, y2])
                            {

                                list.Add($"{x2} {y2}");
                                checker = true;
                            }
                        }
                        catch (Exception e)
                        {
                        }
                        try
                        {
                            if (board[i, j] == board[x3, y3])
                            {

                                list.Add($"{x3} {y3}");
                                checker = true;
                            }
                        }
                        catch (Exception e)
                        {
                        }
                        try
                        {
                            if (board[i, j] == board[x4, y4])
                            {

                                list.Add($"{x4} {y4}");
                                checker = true;
                            }
                        }
                        catch (Exception e)
                        {
                        }
                        try
                        {
                            if (board[i, j] == board[x5, y5])
                            {

                                list.Add($"{x5} {y5}");
                                checker = true;
                            }
                        }
                        catch (Exception e)
                        {
                        }
                        try
                        {
                            if (board[i, j] == board[x6, y6])
                            {

                                list.Add($"{x6} {y6}");
                                checker = true;
                            }
                        }
                        catch (Exception e)
                        {
                        }
                        try
                        {
                            if (board[i, j] == board[x7, y7])
                            {

                                list.Add($"{x7} {y7}");
                                checker = true;
                            }
                        }
                        catch (Exception e)
                        {
                        }
                        try
                        {
                            if (board[i, j] == board[x8, y8])
                            {

                                list.Add($"{x8} {y8}");
                                checker = true;
                            }
                        }
                        catch (Exception e)
                        {
                        }
                    }
                    if (checker)
                    {
                        knightsAttacks[$"{i} {j}"] = list;
                    }
                }
            }
            var theMostHits
                = knightsAttacks.Values.Max( x=> x.Count);


            Console.WriteLine();
            Console.WriteLine();
        }
    }
}

我的问题: 找到列表中元素数量最多的密钥后,如何从dic中的其他列表中删除密钥的名称(在本例中为“2 2”)?

0 个答案:

没有答案