一、骑士巡游问题
题目描述:骑士在8*8的国际象棋棋盘上进行巡游,当指定骑士出发的位置后(x,y),能输出骑士遍历棋盘的所有路径坐标。
输出效果:
代码(请在visual stdio下运行,Dev-C++无法编译vector):
#include <utility>
#include <string>
#include <vector>
#include <iostream>
using namespace std;
const int N = 27;
int p, q;
bool st[N][N];
vector<pair<int, int>> path;
int dx[8] = { -2,-2,-1,-1,1,1,2,2 };
int dy[8] = { -1,1,-2,2,-2,2,-1,1 };
bool dfs(int x, int y, int cnt){
path.push_back({ x,y });
if (cnt ==64) {
for (auto a : path) cout << "(" << a.first <<"," << a.second << ")" << endl;
return true;
}
st[x][y] = true;
for (int i = 0; i < 8; i++)
{
int a = x + dx[i], b = y + dy[i];
if (a < 1 || a > 8 || b < 1 || b > 8) continue;
if (st[a][b]) continue;
if (dfs(a, b, cnt + 1))return true; //这点很重要,能保证输出的是字典序最小的。
}
st[x][y] = false;
path.pop_back();
return false;
}
int main(){
int i, j;
cin >> i >> j;
path.clear();
memset(st, 0, sizeof(st));
bool flag = false;
if (dfs(i, j, 1)) {
flag = true;
}
}
【如何解决了问题,烦请点赞+收藏】