Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 领土游戏的更好实现(在时间复杂性方面)_Algorithm_Time Complexity_Big O - Fatal编程技术网

Algorithm 领土游戏的更好实现(在时间复杂性方面)

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)?我

想象一个10x10网格的领土游戏

玩家A占据了棋盘上的方块,如下图所示

玩家B将尝试发射导弹摧毁A的领土。这里,H代表命中,M代表未命中

给定一个方法签名,通过传入领土列表和导弹坐标,尝试返回被摧毁的领土数,在显示图像的情况下,它将返回1。(注:相邻黄色区块视为一个区域)

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;
         }