前言
简单问题,写的不好,大佬见谅.
如有疏漏,恳请指正,小编垂首.
问题描述:
•现要将马从(x,y)跳到(x1,y1)的位置。
•在不移动其他棋子的情况下,能否完成目标。
问题解析:
迷宫问题变种,dfs
实现代码:
代码如下(示例):
#include<iostream>
#include<string>
using namespace std;
char s[10][10];
int vis[10][10];//标记数组
//方向数组
int dir[8][2] = { {2,1},{1,2},{-1,2},{-2,1},{-2,-1},{-1,-2}, {1,-2}, {2,-1} };
//越界判断
bool in(int x, int y) {
return x >= 0 && x < 10 && y >= 0 && y < 9;
}
bool dfs(int x, int y) {
if (s[x][y] == 'T') {//终点
return true;
}
vis[x][y] = 1;//已经遍历标记
s[x][y] = 'm';//标记路径
for (int i = 0; i < 8; i++) {
int tx = x + dir[i][0];
int ty = y + dir[i][1];
if (in(tx, ty) && s[tx][ty] != '#' && !vis[tx][ty]) {
if (dfs(tx, ty)) {//递归
return true;
}
}
}
vis[x][y] = 0;//未能抵达回退标记
s[x][y] = '.';
return false;
}
int main() {
for (int i = 0; i < 10; i++) {
cin>>s[i];//读棋盘
}
int sx, sy;//起点位置
for (int i = 0; i < 10; i++) {
for (int j = 0; j < 9; j++) {
if (s[i][j] == 'S') {
sx = i; sy = j;
}
}
}
//调用dfs
if (dfs(sx, sy)) {
cout << "yes" << endl;
}
else {
cout << "no" << endl;
}
for (int i = 0; i < 10; i++) {
cout << s[i]<<endl;//字符串
}
return 0;
}
测试案例:
总结
此法可行,但由于路径不唯一,且遍历以方向数组顺序进行
显示并非最短路径