// find_horse.cpp : Defines the entry point for the console application. // //如果需要打印路径,把PosPair改为结构体,里面加入当前坐标的前驱坐标 //可以考虑用A*算法,设计较好的启发函数,减少搜索次数 #include <iostream> #include <queue> #include <utility> using namespace std; typedef pair<int, int> PosPair; template <typename Type, int row, int col> int FindMinSteps(Type (&pos)[row][col], int x1, int y1, int x2, int y2) { if (x1 == x1 && y1 == y2) { return 0; } int offset_x[] = {-2,-2,-1,-1,1,1,2,2}; int offset_y[] = {1,-1,2,-2,2,-2,1,-1}; int x, y, a, b; memset(pos, 0, sizeof(pos)); //初始化 0表示未访问过,1前向访问,2后向访问 //-1前向每步最后一个坐标,-2后向每步最后一个坐标 pos[x1][y1] = -1; pos[x2][y2] = -2; queue<PosPair> forwardSearch; queue<PosPair> backwardSearch; int fstep=0; //记录从前向后搜索的步数 int bstep=0; //记录从后向前搜索的步数 PosPair t; forwardSearch.push(make_pair(x1, y1)); backwardSearch.push(make_pair(x2, y2)); while(!forwardSearch.empty() || !backwardSearch.empty()) { if(!forwardSearch.empty()) { do { t = forwardSearch.front(); forwardSearch.pop(); x = t.first; y = t.second; printf("F: x=%d y=%d/n", x, y); for (int i=0; i < 8; i++) //寻找当前点周围的8个可以跳过去的点 { a = x + offset_x[i]; b = y + offset_y[i]; if (a < 0 || b < 0) //越界 continue; if(abs(pos[a][b]) == 2) //遇到后向搜索的节点,打印步数 { return fstep+bstep+1; } if(pos[a][b] == 0) //未访问过 { pos[a][b] = 1; forwardSearch.push(make_pair(a, b)); } } } while (pos[x][y] != -1); fstep++; t = forwardSearch.front(); forwardSearch.pop(); x = t.first; y = t.second; pos[x][y] = -1; forwardSearch.push(t); } if(!backwardSearch.empty()) { do { t = backwardSearch.front(); backwardSearch.pop(); x = t.first; y = t.second; printf("B: x=%d y=%d/n", x, y); for (int i=0; i < 8; i++) //寻找当前点周围的8个可以跳过去的点 { a = x + offset_x[i]; b = y + offset_y[i]; if (a < 0 || b < 0 ) //越界 continue; if(abs(pos[a][b]) == 1) //遇到前向搜索的节点,打印步数 { return fstep+bstep+1; } if(pos[a][b] == 0) //未访问过 { pos[a][b] = 2; backwardSearch.push(make_pair(a, b)); } } } while (pos[x][y] != -2); bstep++; t = backwardSearch.front(); backwardSearch.pop(); x = t.first; y = t.second; pos[x][y] = -2; backwardSearch.push(t); } } return -1; } int main(int argc, char* argv[]) { int chessboard[9][10]; cout << FindMinSteps(chessboard, 0, 0, 7, 7) << endl; return 0; }