Skip to content

Commit

Permalink
添加 八数码测试 && 无解带求
Browse files Browse the repository at this point in the history
  • Loading branch information
golitter committed May 2, 2024
1 parent df22bee commit cff1d64
Show file tree
Hide file tree
Showing 6 changed files with 70 additions and 8 deletions.
2 changes: 1 addition & 1 deletion CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ include(CTest)
enable_testing()
include_directories(include)

add_executable(EightPuzzle-AStar-IDDFS main.cpp src/A_star.cpp src/cantor_expansion.cpp src/input_processor.cpp)
add_executable(EightPuzzle-AStar-IDDFS main.cpp src/A_star.cpp src/cantor_expansion.cpp src/input_processor.cpp src/test_cases.cpp)

set(CPACK_PROJECT_NAME ${PROJECT_NAME})
set(CPACK_PROJECT_VERSION ${PROJECT_VERSION})
Expand Down
3 changes: 2 additions & 1 deletion include/input_processor.h
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
#pragma once
#include <iostream>
#include <string>
#include <vector>
Expand All @@ -13,7 +14,7 @@ void display_menu();
bool check_init_stat(std::vector<int> vec);

// 以棋盘格式打印八数码
void printBoard();
void printBoard(std::vector<int> vec);

// 输入初始状态
void input_init_stat();
Expand Down
13 changes: 13 additions & 0 deletions include/test_cases.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
#pragma once
#include "A_star.h"
#include "input_processor.h"
#include <iostream>
#include <vector>
#include <map>
#include <chrono>

namespace EP_TEST {

// 测试所有情况
void test_all_case();
}
5 changes: 5 additions & 0 deletions main.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
#include "include/cantor_expansion.h"
#include "include/A_star.h"
#include "include/input_processor.h"
#include "include/test_cases.h"
void test_Cantor() {
std::cout<<Cantor::get_fact(3, 4)<<std::endl;

Expand All @@ -15,10 +16,14 @@ void test_Eight() {
// IDDFS(9, {1,2,3,4,5,6,7,8,0});
// IDDFS(2, {1,2,0,3,4,5,6,7,8});
}
void test_TEST() {
EP_TEST::test_all_case();
}
int main(int, char**){
std::cout << "Hello, from EightPuzzle-AStar-IDDFS!\n";
// test_Cantor();
// test_Ev();
// EightPuzzleInput::start();
test_Eight();
test_TEST();
}
12 changes: 6 additions & 6 deletions src/input_processor.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -35,10 +35,10 @@ bool check_init_stat(std::vector<int> vec) {
return true;
}

void printBoard() {
void printBoard(std::vector<int> vec) {
int cnt = 0;
for(int i = 0; i < 9; ++i) {
std::cout<<init_stat[i]<<" ";
std::cout<<vec[i]<<" ";
cnt++;
if(cnt == 3) {
cnt = 0;
Expand Down Expand Up @@ -66,11 +66,11 @@ void input_init_stat() {
}
if( !check_init_stat(init_stat)) {
std::cout<<"初始状态不合法:"<<std::endl;
printBoard();
printBoard(init_stat);
return ;
}
std::cout<<"初始状态为:"<<std::endl;
printBoard();
printBoard(init_stat);
std::cout<<std::endl;
}

Expand Down Expand Up @@ -102,12 +102,12 @@ void input_target_stat() {
}
if( !check_init_stat(target_stat)) {
std::cout<<"目标状态不合法:"<<std::endl;
printBoard();
printBoard(init_stat);
return ;
}
}
std::cout<<"目标状态为:"<<std::endl;
printBoard();
printBoard(init_stat);
std::cout<<std::endl;
}

Expand Down
43 changes: 43 additions & 0 deletions src/test_cases.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
#include "../include/test_cases.h"

namespace EP_TEST {
// 搜索用时
std::map<std::vector<int>,double> case_times;
// 无解
std::map<std::vector<int>, bool> no_answer;

int n = 9;
int cnt = 0;
double tms = 0;
std::vector<int> vis(n), p(n);
void dfs(int stp) {
if(stp == n) {
int pos = 0;
for(int i = 0; i < n; ++i) if(p[i] == 0) {pos = i; break; }
EightPuzzleInput::printBoard(p);
auto start = std::chrono::high_resolution_clock::now();
IDDFS(pos, p);
// 获取结束时间点
auto end = std::chrono::high_resolution_clock::now();

// 计算函数运行时间
std::chrono::duration<double> duration = end - start;

// 输出运行时间(以秒为单位)
case_times[p] = duration.count();
cnt++; tms += duration.count();
}
for(int i = 0; i < n; ++i) {
if(vis[i]) continue;
vis[i] = 1;
p[stp] = i;
dfs(stp + 1);
vis[i] = 0;
}
};
void test_all_case() {
dfs(0);
std::cout<<"平均 "<<tms / cnt<<std::endl;
}

}

0 comments on commit cff1d64

Please sign in to comment.