verification des coups passes
This commit is contained in:
parent
d6d2c5def5
commit
fc077eb86b
5 changed files with 41 additions and 13 deletions
0
TP1/C-Cpp/Screens-1/scree-test.txt
Normal file
0
TP1/C-Cpp/Screens-1/scree-test.txt
Normal file
|
@ -5,4 +5,3 @@
|
||||||
#......#
|
#......#
|
||||||
# #
|
# #
|
||||||
########
|
########
|
||||||
|
|
||||||
|
|
|
@ -53,6 +53,6 @@ typedef struct {
|
||||||
} Node;
|
} Node;
|
||||||
|
|
||||||
int bfs(Node &result);
|
int bfs(Node &result);
|
||||||
int dfs(Node &result, int depth);
|
int dfs(Node &result, int depth, std::vector<Node> history);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -99,6 +99,22 @@ void sok_board_t::load(char *_file) {
|
||||||
fclose(fp);
|
fclose(fp);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool is_in_history(Node current, std::vector<Node> history) {
|
||||||
|
for (int i = 0; i < history.size(); ++i) {
|
||||||
|
Node noeud = history[i];
|
||||||
|
|
||||||
|
int c = 0;
|
||||||
|
for (int l = 0; l < NBL; ++l) {
|
||||||
|
for (int m = 0; m < NBC; ++m) {
|
||||||
|
if (current.state.board[l][m] != current.state.board[l][m]) c++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (c == 0) return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
int bfs(Node &result) {
|
int bfs(Node &result) {
|
||||||
// Création de la queue de BFS
|
// Création de la queue de BFS
|
||||||
std::queue<Node> q;
|
std::queue<Node> q;
|
||||||
|
@ -219,7 +235,8 @@ int bfs(Node &result) {
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
int dfs(Node &result, int depth) {
|
int dfs(Node &result, int depth, std::vector<Node> history) {
|
||||||
|
|
||||||
// Si on a atteint la profondeur maximale, on arrête la recherche
|
// Si on a atteint la profondeur maximale, on arrête la recherche
|
||||||
if (depth == MAX_DEPTH) {
|
if (depth == MAX_DEPTH) {
|
||||||
/* std::cout << "max\n"; */
|
/* std::cout << "max\n"; */
|
||||||
|
@ -268,11 +285,16 @@ int dfs(Node &result, int depth) {
|
||||||
next_dfs.path_len = result.path_len + 1;
|
next_dfs.path_len = result.path_len + 1;
|
||||||
next_dfs.path = result.path + move_str[i] + " ";
|
next_dfs.path = result.path + move_str[i] + " ";
|
||||||
|
|
||||||
int res = dfs(next_dfs, depth + 1);
|
if (!is_in_history(next_dfs, history)) {
|
||||||
|
history.push_back(next_dfs);
|
||||||
|
int res = dfs(next_dfs, depth + 1, history);
|
||||||
if (res == 0) {
|
if (res == 0) {
|
||||||
result = next_dfs;
|
result = next_dfs;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
} else {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Si la case devant le joueur est une caisse, on déplace la caisse et le
|
// Si la case devant le joueur est une caisse, on déplace la caisse et le
|
||||||
|
@ -322,11 +344,16 @@ int dfs(Node &result, int depth) {
|
||||||
next_dfs.path_len = result.path_len + 1;
|
next_dfs.path_len = result.path_len + 1;
|
||||||
next_dfs.path = result.path + move_str[i] + " ";
|
next_dfs.path = result.path + move_str[i] + " ";
|
||||||
|
|
||||||
int res = dfs(next_dfs, depth + 1);
|
if (!is_in_history(next_dfs, history)) {
|
||||||
|
history.push_back(next_dfs);
|
||||||
|
int res = dfs(next_dfs, depth + 1, history);
|
||||||
if (res == 0) {
|
if (res == 0) {
|
||||||
result = next_dfs;
|
result = next_dfs;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
} else {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -23,7 +23,9 @@ int main(int _ac, char **_av) {
|
||||||
std::cout << "Solution : " << result.path << "\n";
|
std::cout << "Solution : " << result.path << "\n";
|
||||||
} */
|
} */
|
||||||
|
|
||||||
if (dfs(result, 0) == -1) {
|
std::vector<Node> history;
|
||||||
|
|
||||||
|
if (dfs(result, 0, history) == -1) {
|
||||||
std::cout << "Aucune solution trouvée\n";
|
std::cout << "Aucune solution trouvée\n";
|
||||||
} else {
|
} else {
|
||||||
std::cout << "Coups : " << result.path_len << "\n";
|
std::cout << "Coups : " << result.path_len << "\n";
|
||||||
|
|
Reference in a new issue