preorder(node)
print node.value
if node.left != null
then preorder(node.left)
if node.right != null
then preorder(node.right)
inorder(node)
if node.left != null
then inorder(node.left)
print node.value
if node.right != null
then inorder(node.right)
postorder(node)
if node.left != null
then postorder(node.left)
if node.right != null
then postorder(node.right)
print node.value
void DepthFirstSearch(node v){
node u;
visit v;
for(each child u of v)
DepthFirstSearch(u);
}
void checknode(node v){
if(promising(v))
if(there is a solution at v)
write the solution;
else
for(each child u of v)
checknode(u);
}
void checknode(node v){
node u;
if(promising(v))
if(there is a solution at v)
write the solution;
else
for(each child u of v)
checknode(u);
}
boolean promising(index i){
index k=1;
boolean p = true; // 노드 유망성 여부
while(k<=i && p){
if(col[i] == col[k] || abs(col[i]-col[k] == i-k)
p = false; // 같은 열에 있거나 같은 대각선에 있으면 유망성 X
k++;
}
return p;
}
void queens(index i){
index j; // 열 인덱스
if(promising(i))
if(i==n) // leaf 노드이면
cout << col[1] through col[n]
else
for(j=1; j<=n; j++){
col[i+1] = j;
queens(i+1);
}
void SumOfSubset(index i, int weight, int total){
if(promising(i))
if(weight == W) print solution;
else{
include[i+1] = true; // 다음 item 포함했을 때
SumOfSubset(i+1, weight+w[i+1], total-w[i+1]);
include[i+1] = false; // 다음 item 포함했을 때
SumOfSubset(i+1, weight, total-w[i+1]);
}
}
boolean promising(index i){
return (weight+total >= W) && (weight == W || weight+w[i+1] <= W);
}
void m_coloring(index i){
int color;
if(promising(i))
if(i==n) print output;
else
for(color=1; color <= m; color++){ // 다음 정점에 대해 모든 색 시도
vcolor[i+1] = color;
m_coloring(i+1);
}
}
bool promising(index i){
index j;
bool switch;
switch = true;
j=1;
while(j < i && switch){ // 인접 정점이 동일한 색d이면
switch = false; // 노드 유망 X
j++;
}
return switch;
}
void hamiltonian(index i){
index j;
if(promising(i))
if(i == n) print output;
else
for(j=2; j <=n; j++){ //
vindex[i+1] = j;
hamiltonian(i+1);
}
}
bool promising(index i){
index j;
if(i == n-1 && !W[vindex[n-1]][vindex[0]])
switch = false // 첫 번째 정점과 인접해야 함
else if(i>0 && !W[vindex[i-1][vindex[i]])
switch = false; // i번째 정점은 (i-1)번째 정점과 인접해야 함
else{
switch = true;
j=1;
while(j<i && switch){
if(vindex[i] == vindex[j]) // 이미 방문한 노드이면
switch = false;
j++;
}
}
return switch;
}
1. 뿌리마디의 유망한 자식마디 개수: m0
2. 상태공간트리의 수준 1에서 유망한 마디 하나 랜덤하게 정하고, 해당 마디의 유망한 자식마디 개수 m1
3. 정한 마디의 유망한 마디 하나 랜덤하게 정하고, 해당 마디의 유망한 자식마디 개수 m2
4. ...
5. 더 이상 유망한 자식마디가 없을 때까지 과정 반복
[Softeer] A+B (C++) (0) | 2023.03.28 |
---|---|
[Softeer] 근무 시간 (C++) (0) | 2023.03.28 |
[알고리즘] Greedy Algorithm (2) (0) | 2022.01.08 |
[알고리즘] Greedy Algorithm (1) (0) | 2022.01.08 |
[백준(BOJ)] 11656번: 접미사 배열 (C++) (0) | 2021.08.30 |