C ++
 Computer >> コンピューター >  >> プログラミング >> C ++

隣接する絵画がC++で同じ色にならないようにN枚の絵画をペイントする方法


この問題では、2つの整数nとmが与えられます。ここで、nは絵画の数、mは使用可能な色の数です。私たちの仕事は、連続する絵が同じ色にならないように絵を描くことができる方法の総数を見つけるプログラムを作成することです。

問題を理解するために例を見てみましょう

入力

n = 3, m =3

出力

12

説明

P1 P2 P3
C1 C2 C3
C1 C3 C2
C1 C2 C1
C1 C3 C1
C2 C1 C2
C2 C3 C2
C2 C1 C3
C2 C3 C1
C3 C1 C3
C3 C2 C3
C3 C1 C2
C3 C2 C1

この問題を解決するために、n個の絵すべてをm色でペイントできます。これで、最後の絵のペイントに使用した色を除いて、次の絵をn-1色でペイントできます。つまり、ウェイの総数は、

n*(m-1)(n-1)

ソリューションの実装を示すプログラム

#include <iostream>
#define modd 1000000007
using namespace std;
unsigned long calcPower(unsigned long base, unsigned long power, unsigned long p){
   unsigned long result = 1;
   base = base % p;
   while (power > 0) {
      if (power & 1)
         result = (result * base) % p;
      power = power >> 1;
      base = (base * base) % p;
   }
   return result;
}
int colorPainting(int n, int m){
   return calcPower(m - 1, n - 1, modd) * m % modd;
}
int main(){
   int n = 5, m = 7;
   cout<<"The number of ways to color the given paintings is : "<<colorPainting(n, m);
   return 0;
}

出力

The number of ways to color the given paintings is : 9072

  1. C++で交差しないハンドシェイク

    円の周りに立っているn人が偶数で、各人が他の人と握手しているとすると、合計n/2回の握手があります。どのハンドシェイクも交差しないように、これらのハンドシェイクが発生する可能性のある方法の数を見つける必要があります。答えは非常に大きい可能性があるため、答えmod 10 ^ 9+7を返します。 したがって、入力がn =2の場合、出力は1になります これを解決するには、次の手順に従います- m:=10 ^ 9 + 7 サイズ(n + 1)の配列dpを定義します dp [0]:=1 初期化i:=0の場合、i <=nの場合、更新i:=i + 2、do −

  2. C++でN×3グリッドをペイントする方法の数

    サイズnx3のグリッドがあり、グリッドの各セルを3色のうちの1つだけでペイントするとします。色は赤、黄、緑です。これで、隣接する2つのセルが同じ色にならないという制約があります。グリッドの行数はnです。このグリッドをペイントする方法の数を見つける必要があります。答えは非常に大きい可能性があるため、10 ^ 9+7を法として返します。 したがって、入力が1のような場合、出力は12になります これを解決するには、次の手順に従います- m =1 ^ 9 + 7 関数add()を定義します。これには、a、b、が必要です。 return((a mod m)+(b mod m