这个有点长,所以如果你不认为你需要上下文来回答,我会把问题放在最底层。
我需要计算哪个(国际象棋)骑士在一个只有骑士的板上攻击其他骑士,并移除尽可能少的骑士,以便没有人互相攻击。
输入:
5 OKOKO KOOOK OOKOO KOOOK OKOKO
第一个数字是棋盘的大小(行和列),'空空间','K'骑士。
所以我的想法是通过矩阵中的一个循环(我希望它尽可能快)来保存骑士的位置以及他在列表中踩到的所有骑士的位置,像这样的字典(字符串将是由空格分隔的索引):
Dictionary<string, List<string>> knightsAttacks = new Dictionary<string, List<string>>();
这样我就可以计算列表中元素的数量,然后删除列表中索引最多的元素,之后我删除,这个骑士索引来自所有其他骑士列表,如果所有骑士的所有列表都是空的意思是没有骑士互相干扰。在上面给出的这个例子中,字典看起来像这样:
选定的骑士是计数最多的骑士(大多数命中),所以我需要从其他骑士名单中删除他和他的索引(“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”)?