📜  绘画成本n * m格

📅  最后修改于: 2021-05-07 01:10:23             🧑  作者: Mango

给定两个整数nm ,它们是网格的尺寸。任务是找到按单元绘制网格单元的成本,其中绘制单元的成本等于相邻单元的绘制单元数。如果尚未绘制任何单元格,则可以随时对其进行绘制,从而将绘制网格的成本降至最低。

例子:

一个简单的解决方案是生成使用n * m个单元格(即n * m!)绘制网格的所有可能方式计算其中每个的成本。
时间复杂度: O(n * m!)

高效方法:了解此图中的着色过程,而不是网格。因此,单元格的颜色等于图形顶点的颜色。绘制单元格所获得的成本等于该单元的有色邻居的数量。这意味着获得的成本将是当前像元与相邻彩色像元之间的边数。

关键要注意的是,在所有单元格着色结束后,将标记图形的所有边缘。

一个有趣的事实是,图形的边缘仅被标记了一次。这是因为边缘连接两个单元。当两个单元都被绘制时,我们标记该单元。我们不允许一个单元绘制多于一次,以确保我们仅标记每个单元一次。

因此,无论您对单元进行着色的顺序如何,标记边缘的数量均保持不变,因此成本也将相同。

对于给定的网格,边的数量将为n *(m – 1)+ m *(n – 1) 。这是因为每一行都由m – 1个边组成,而每一列则由n – 1个边组成。

下面是上述方法的实现:

C++
// C++ implementation of the approach
#include 
using namespace std;
  
// Function to return the minimum cost
int getMinCost(int n, int m)
{
    int cost = (n - 1) * m + (m - 1) * n;
    return cost;
}
  
// Driver code
int main()
{
    int n = 4, m = 5;
    cout << getMinCost(n, m);
  
    return 0;
}


Java
// Java implementation of the approach
class gfg
{
      
// Function to return the minimum cost
static int getMinCost(int n, int m)
{
    int cost = (n - 1) * m + (m - 1) * n;
    return cost;
}
  
// Driver code
public static void main(String[] args)
{
    int n = 4, m = 5;
    System.out.println(getMinCost(n, m));
}
}
  
// This code is contributed by Code_Mech.


Python3
# Python3 implementation of the approach 
  
# Function to return the minimum cost 
def getMinCost(n, m): 
  
    cost = (n - 1) * m + (m - 1) * n 
    return cost 
  
# Driver code 
if __name__ == "__main__": 
  
    n, m = 4, 5
    print(getMinCost(n, m)) 
  
# This code is contributed by
# Rituraj Jain


C#
// C# implementation of the approach
using System;
  
class GFG
{
      
// Function to return the minimum cost
static int getMinCost(int n, int m)
{
    int cost = (n - 1) * m + (m - 1) * n;
    return cost;
}
  
// Driver code
public static void Main()
{
    int n = 4, m = 5;
    Console.WriteLine(getMinCost(n, m));
}
}
  
// This code is contributed 
// by Akanksha Rai


PHP


输出:
31