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

C++で指定された条件でグリッドに8つの数字を入力します


1、2、3、4、5、6、7、8を、指定された図の8つの円に配置するとします。このようにして、シーケンス内で隣接する番号に隣接する番号はありません。

したがって、入力が次のような場合

0 -
1
-
1
0
-
1
-
1
-
1
-
1
0 -
1
-
1
0

その場合、出力は次のようになります

C++で指定された条件でグリッドに8つの数字を入力します

これを解決するには、次の手順に従います-

  • N:=3、M:=4
  • 考慮されていません:=-1
  • 関数present_in_grid()を定義します。これには、grid [N] [M]、num、
  • が必要です。
  • iを初期化する場合:=0、i
  • jを初期化する場合:=0、j
  • grid [i、j]がnumと同じ場合、-
    • trueを返す
  • falseを返す
  • 関数isSafe()を定義します。これには、grid [N] [M]、row、col、num、
  • が必要です。
  • 行が0と同じで、列が1と同じ場合、-
    • present_in_grid(grid、num)または| num --grid [row、col +1]|の場合<=1または|num--grid [row + 1、col] | <=1または|num--grid [row + 1、col --1] | <=1または|num--grid [row + 1、col + 1] | <=1、次に-
      • falseを返す
  • それ以外の場合、rowが0と同じで、colが2と同じ場合、-
    • present_in_grid(grid、num)または| num --grid [row、col-1]|の場合<=1または|num--grid [row + 1、col] | <=1または|num--grid [row + 1、col + 1] | <=1または|num--grid [row + 1、col --1] | <=1、次に-
      • falseを返す
  • それ以外の場合、rowが1と同じで、colが0と同じ場合、-
    • present_in_grid(grid、num)または| num --grid [row -1、col +1]|の場合<=1または|num--grid [row、col + 1] | <=1または|num--grid [row + 1、col + 1] | <=1、次に-
    • falseを返す
  • それ以外の場合、行が1で、列が3の場合、-
    • present_in_grid(grid、num)または| num --grid [row -1、col-1]|の場合<=1または|num--grid [row、col --1] | <=1または|num--grid [row + 1、col --1] | <=1、次に-
      • falseを返す
  • それ以外の場合、rowが2と同じで、colが1と同じ場合、-
    • present_in_grid(grid、num)または| num --grid [row -1、col-1]|の場合<=1または|num--grid [row -1、col] | <=1または|num--grid [row -1、col + 1] | <=1または|num--grid [row、col + 1] | <=1、次に-
      • falseを返す
  • それ以外の場合、rowが2と同じで、colが2と同じ場合、-
    • present_in_grid(grid、num)または| num --grid [row、col-1]|の場合<=1または|num--grid [row -1、col] | <=1または|num--grid [row -1、col + 1] | <=1または|num--grid [row -1、col -1] | <=1、次に-
      • falseを返す
  • それ以外の場合、rowが1と同じで、colが1と同じ場合、-
    • present_in_grid(grid、num)または| num --grid [row、col-1]|の場合<=1または|num--grid [row -1、col] | <=1または|num--grid [row -1、col + 1] | <=1または|num--grid [row、col + 1] | <=1または|num--grid [row + 1、col + 1] | <=1または|num--grid [row + 1、col] | <=1、次に-
      • falseを返す
  • それ以外の場合、行が1で、列が2の場合、-
    • present_in_grid(grid、num)または| num --grid [row、col-1]|の場合<=1または|num--grid [row -1、col] | <=1または|num--grid [row + 1、col --1] | <=1または|num--grid [row、col + 1] | <=1または|num--grid [row -1、col -1] | <=1または|num--grid [row + 1、col] | 1、次に-
      • falseを返す
  • trueを返す
  • 関数search_free_location()を定義します。これには、grid [N] [M]、row、col、
      が必要です。
    • 行を初期化する場合:=0、行
    • col:=0を初期化する場合、col
    • grid [row、col]がNOTCONSIDEREDと同じである場合、-
      • trueを返す
  • falseを返す
  • 関数Solve()を定義します。これには、grid[N][M]が必要です。
  • search_free_location(grid、row、col)がfalseの場合、-
    • trueを返す
  • num:=1を初期化する場合、num <=8の場合、更新(numを1増やします)、-
      を実行します。
    • isSafe(grid、row、col、num)の場合、-
      • grid [row、col]:=num
      • Solve(grid)がtrueの場合、-
        • trueを返す
    • grid [row、col]:=考慮されていません
  • falseを返す
  • 理解を深めるために、次の実装を見てみましょう-

    #include <cmath>
    #include <iostream>
    #define N 3
    #define M 4
    #define NOTCONSIDERED -1
    using namespace std;
    bool present_in_grid(int grid[N][M], int num) {
       for (int i = 0; i < N; i++) {
          for (int j = 0; j < M; j++)
             if (grid[i][j] == num)
                return true;
       }
       return false;
    }
    bool isSafe(int grid[N][M], int row, int col, int num) {
       if (row == 0 && col == 1) {
          if (present_in_grid(grid, num) || (abs(num - grid[row][col + 1]) <= 1) || (abs(num - grid[row + 1][col]) <= 1) || (abs(num - grid[row + 1][col - 1]) <= 1) || (abs(num - grid[row + 1][col + 1]) <= 1))
             return false;
       }
       else if (row == 0 && col == 2) {
          if (present_in_grid(grid, num) || (abs(num - grid[row][col - 1]) <= 1) || (abs(num - grid[row + 1][col]) <= 1) || (abs(num - grid[row + 1][col + 1]) <= 1) || (abs(num - grid[row + 1][col - 1]) <= 1))
             return false;
       }
       else if (row == 1 && col == 0) {
          if (present_in_grid(grid, num) || (abs(num - grid[row - 1][col + 1]) <= 1) || (abs(num - grid[row][col + 1]) <= 1) || (abs(num - grid[row + 1][col + 1]) <= 1))
             return false;
       }
       else if (row == 1 && col == 3) {
          if (present_in_grid(grid, num) || (abs(num - grid[row - 1][col - 1]) <= 1) || (abs(num - grid[row][col - 1]) <= 1) || (abs(num - grid[row + 1][col - 1]) <= 1))
             return false;
       }
       else if (row == 2 && col == 1) {
       if (present_in_grid(grid, num) || (abs(num - grid[row - 1][col - 1]) <= 1) || (abs(num - grid[row - 1][col]) <= 1) || (abs(num - grid[row - 1][col + 1]) <= 1) || (abs(num - grid[row][col + 1]) <= 1))
          return false;
       }
       else if (row == 2 && col == 2) {
          if (present_in_grid(grid, num) || (abs(num - grid[row][col - 1]) <= 1) || (abs(num - grid[row - 1][col]) <= 1) || (abs(num - grid[row - 1][col + 1]) <= 1) || (abs(num - grid[row - 1][col - 1]) <= 1))
             return false;
       }
       else if (row == 1 && col == 1) {
          if (present_in_grid(grid, num) || (abs(num - grid[row][col - 1]) <= 1) || (abs(num - grid[row - 1][col]) <= 1) || (abs(num - grid[row - 1][col + 1]) <= 1) || (abs(num - grid[row][col + 1]) <= 1) || (abs(num - grid[row + 1][col + 1]) <= 1) || (abs(num - grid[row + 1][col]) <= 1))
             return false;
       }
       else if (row == 1 && col == 2) {
          if (present_in_grid(grid, num) || (abs(num - grid[row][col - 1]) <= 1) || (abs(num - grid[row - 1][col]) <= 1) || (abs(num - grid[row + 1][col - 1]) <= 1) || (abs(num - grid[row][col + 1]) <= 1) || (abs(num - grid[row - 1][col - 1]) <= 1) || (abs(num - grid[row + 1][col]) <= 1))
             return false;
       }
       return true;
    }
    bool search_free_location(int grid[N][M], int& row, int& col) {
       for (row = 0; row < N; row++)
       for (col = 0; col < M; col++) {
          if (grid[row][col] == NOTCONSIDERED)
             return true;
       }
       return false;
    }
    void show_res(int grid[N][M]) {
       for (int i = 0; i < N; i++) {
          if (i == 0 || i == N - 1)
             cout << " ";
          for (int j = 0; j < M; j++) {
             if (grid[i][j] == 0)
                cout << " ";
             else
                cout << grid[i][j] << " ";
          }
          cout << endl;
       }
    }
    bool Solve(int grid[N][M]) {
       int row, col;
       if (!search_free_location(grid, row, col))
       return true;
       for (int num = 1; num <= 8; num++) {
          if (isSafe(grid, row, col, num)) {
             grid[row][col] = num;
             if (Solve(grid))
                return true;
             grid[row][col] = NOTCONSIDERED;
          }
       }
       return false;
    }
    int main(){
       int grid[N][M] = { { 0, -1, -1, 0 },
          { -1, -1, -1, -1 },
          { 0, -1, -1, 0 } };
       if (Solve(grid))
          show_res(grid);
       else
          cout << "Not possible";
    }

    入力

    { { 0, -1, -1, 0 },
    { -1, -1, -1, -1},
    { 0, -1, -1, 0 }}

    出力

      3 5
    7 1 8 2
      4 6

    1. 特定の条件でグラフを作成するC++プログラム

      NとKの2つの数があるとします。N個の要素を持つ無向グラフがあるとします。 N個の頂点は次の条件を満たす- グラフはシンプルで接続されています 頂点には1からNまでの番号が付けられています グラフのエッジの数をMとします。エッジには1からMまでの番号が付けられます。エッジの長さは1です。エッジiは頂点U[i]を頂点V[i]に接続します。 頂点のペア(i、j)は正確にKペアあり、i

    2. C++で指定された値を持つ葉を削除する

      二分木と整数のターゲットがあるとすると、値のターゲットを持つすべてのリーフノードを削除する必要があります。親ノードがリーフノードになり、値ターゲットを持つ場合、値ターゲットを持つリーフノードを削除すると、それも削除する必要があることに注意する必要があります(できなくなるまでそれを続ける必要があります)。したがって、ツリーが以下のようになり、ターゲットが2の場合、最終的なツリーは最後のツリーのようになります- これを解決するには、次の手順に従います- remLeaf()と呼ばれる再帰メソッドを定義します。これにより、ルートとターゲットが取得されます ルートがnullの場合、n