a是當前獲得的部分解;
k是搜尋深度;
input是其它輸入;
is_a_solution(a,k,input)判斷當前的部分解向量a[1...k]是否是乙個符合條件的解;
construct_candidates(a,k,input,c,ncandidates)根據目前狀態,構造這一步可能的選擇,存入c陣列,其長度存入ncandidates;
process_solution(a,k,input)對於符合條件的解進行處理,通常是輸出、計數等;
make_move(a,k,input)和unmake_move(a,k,input)前者將採取的選擇更新到原始資料結構上,後者把這一行為撤銷。
//構造記錄座標的結構體
struct point
; bool operator==(const point&point)
return false;
}};//遞迴函式
void backtrack(vector>&board, int row, int column, point point, vector>&visit, vector&output)
//遞迴基
if (board[point.x][point.y] == 'x')
output.push_back(point);
visit[point.x][point.y] = 1;
//往右深入
point point1(point.x, point.y + 1);
if (point1.y=0) }
//往上深入
point point4(point.x - 1, point.y);
if (point4.x>=0) }
}void fliposurrendedbyx(vector>&board, int row, int column)
visit.push_back(vec1);
} for (int i = 0; i < row; ++i)
if (!discovered.empty())
}for (auto point : discovered)
}} }
return;
} int main()
input.push_back(vec1);
} fliposurrendedbyx(input, size, size);
for (auto& row:input)
cout << endl;
} system("pause");
return 0;
}測試結果如下:
(1)判斷當前解是否為有效解:當前解的大小和輸入序列的大小相同;
(2)是則輸出;
(3)不是的話,則根據當前的狀態,構造下乙個可能的取值;
(4)遞迴逐一的嘗試不同的取值。
//判斷是否是乙個合法的全排列
bool isanarrangement(vectorsolution, vectorinput)
} }else
return result;
}void backtrack(vectorsolution, vectorinput)
else
}//應注意去重
關於深度優先和廣度優先的問題
depth first search和breadth first search,即深度優先和廣度優先是圖的兩種搜尋的方法。其實與其說是方法,不如說是兩種思想。下面我們就來介紹這兩種思想。1 depth first search 深度優先是指在圖的查詢中,對每乙個分支深入到不能再深入為止,如果到達了終...
Python 樹的深度優先和廣度優先
廣度優先和深度優先 樹的節點,如果是第乙個,則為root節點 class node def init self,value self.val value self.left none self.right none 定義樹 class tree def init self self.root non...
類的繼承,深度優先於廣度優先
coding utf 8 class people object def init self self.age 45 print people def sleep self print 123 class relation object def init self print relation cl...