Algorithm 领土游戏的更好实现(在时间复杂性方面)
想象一个10x10网格的领土游戏 玩家A占据了棋盘上的方块,如下图所示 玩家B将尝试发射导弹摧毁A的领土。这里,H代表命中,M代表未命中 给定一个方法签名,通过传入领土列表和导弹坐标,尝试返回被摧毁的领土数,在显示图像的情况下,它将返回1。(注:相邻黄色区块视为一个区域)Algorithm 领土游戏的更好实现(在时间复杂性方面),algorithm,time-complexity,big-o,Algorithm,Time Complexity,Big O,想象一个10x10网格的领土游戏 玩家A占据了棋盘上的方块,如下图所示 玩家B将尝试发射导弹摧毁A的领土。这里,H代表命中,M代表未命中 给定一个方法签名,通过传入领土列表和导弹坐标,尝试返回被摧毁的领土数,在显示图像的情况下,它将返回1。(注:相邻黄色区块视为一个区域) int计数(字符串[]领土,字符串[]导弹) 我的实现: 关键点:IsDestroyed2方法将循环所有区域坐标hs坐标 问题,如果我们表示领土的长度为m,导弹的长度为n,那么这种方法的时间复杂度应该是O(m*n)?我
int计数(字符串[]领土,字符串[]导弹)
我的实现:
IsDestroyed2
方法将循环所有区域坐标hs坐标
问题,如果我们表示领土的长度为
m
,导弹的长度为n
,那么这种方法的时间复杂度应该是O(m*n)?我们能有一个算法来解决这个问题吗?这个游戏被称为“战舰”游戏。你可以在线搜索帮助自己。还有,如果时间允许,我会考虑一下,如果有什么想法,我会告诉你。希望有帮助。
public int Count(string[] territories, string[] missiles)
{
// Prepare the data into objects
List<Territory> territoryList = ParseT(territories);
List<Coordinate> coordinates = ParseM(missiles);
// convert it to hashset for fast lookup
HashSet<Coordinate> hs = new HashSet<Coordinate>(coordinates);
return territoryList.Count(t = > t.IsDestroyed2(hs));
}
public bool IsDestroyed2(HashSet<Coordinate> hs)
{
foreach (var co in hsCoordinates)
{
if (!hs.Contains(co))
{
return false;
}
}
return true;
}
public int Count(string[] territories, string[] missiles)
{
// Prepare the data into objects
List<Territory> territoryList = ParseT(territories);
List<Coordinate> coordinates = ParseM(missiles);
foreach (var co in coordinates)
{
foreach (var t in hsCoordinates)
{
bool hit = t.IsHit(co);
if (hit) break;
}
}
return territoryList.Count(t=> t.IsDestroyed);
}
public bool IsHit(Coordinate co)
{
if (hsCoordinates.Contains(co))
{
hsDamaged.Add(co);
return true;
}
return false;
}