C++で指定された条件でグリッドに8つの数字を入力します
1、2、3、4、5、6、7、8を、指定された図の8つの円に配置するとします。このようにして、シーケンス内で隣接する番号に隣接する番号はありません。
したがって、入力が次のような場合
0 | - 1 | - 1 | 0 |
- 1 | - 1 | - 1 | - 1 |
0 | - 1 | - 1 | 0 |
その場合、出力は次のようになります
これを解決するには、次の手順に従います-
- N:=3、M:=4
- 考慮されていません:=-1
- 関数present_in_grid()を定義します。これには、grid [N] [M]、num、 が必要です。
- iを初期化する場合:=0、i
- jを初期化する場合:=0、j
- grid [i、j]がnumと同じ場合、-
- trueを返す
- jを初期化する場合:=0、j
- 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を返す
- 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を返す
- 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を返す
- 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を返す
- 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を返す
- 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を返す
- 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を返す
- 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を返す
- が必要です。
- 行を初期化する場合:=0、行
- col:=0を初期化する場合、col
- grid [row、col]がNOTCONSIDEREDと同じである場合、-
- trueを返す
- col:=0を初期化する場合、col
- trueを返す
- を実行します。
- isSafe(grid、row、col、num)の場合、-
- grid [row、col]:=num
- Solve(grid)がtrueの場合、-
- trueを返す
- grid [row、col]:=考慮されていません
例
理解を深めるために、次の実装を見てみましょう-
#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
-
特定の条件でグラフを作成するC++プログラム
NとKの2つの数があるとします。N個の要素を持つ無向グラフがあるとします。 N個の頂点は次の条件を満たす- グラフはシンプルで接続されています 頂点には1からNまでの番号が付けられています グラフのエッジの数をMとします。エッジには1からMまでの番号が付けられます。エッジの長さは1です。エッジiは頂点U[i]を頂点V[i]に接続します。 頂点のペア(i、j)は正確にKペアあり、i
-
C++で指定された値を持つ葉を削除する
二分木と整数のターゲットがあるとすると、値のターゲットを持つすべてのリーフノードを削除する必要があります。親ノードがリーフノードになり、値ターゲットを持つ場合、値ターゲットを持つリーフノードを削除すると、それも削除する必要があることに注意する必要があります(できなくなるまでそれを続ける必要があります)。したがって、ツリーが以下のようになり、ターゲットが2の場合、最終的なツリーは最後のツリーのようになります- これを解決するには、次の手順に従います- remLeaf()と呼ばれる再帰メソッドを定義します。これにより、ルートとターゲットが取得されます ルートがnullの場合、n