69,371
社区成员
发帖
与我相关
我的任务
分享
#include<iostream>
using namespace std;
//传数组写快点,就不传指针了
void solve(int map[8][8], int coordL,int coordR) {
//已走的格子数
static int flag = 0;
//步数
int step = 0;
//马步方向
int direction[8][2] = { {1,2},{1,-2},{-1,2},{-1,-2},{2,1},{2,-1},{-2,1},{-2,-1} };
//方向控制
int control = 0;
//未走完时
if (flag < 64) {
//确保每次递归如果能走必须走一步
while (true) {
//如果下一步可走,则走
if (map[coordL + direction[control][0]][coordR + direction[control][1]] != 1
&& coordL < 8 && coordL >= 0 && coordR < 8 && coordR >= 0) {
coordL += direction[control][0];
coordR += direction[control][1];
//标记已经走过
map[coordL][coordR] = 1;
flag++;
step = flag;
}
//如果下一步不可走,则切换方向
else {
if (control < 8) {
control++;
}
else {
break;
}
}
}
//继续走下一步,并且在下一步无法进行时回退继续尝试其他走法
while (true) {
//进入下一步
solve(map, coordL, coordR);
//若下一步失败,则回退
if (flag < 64) {
map[coordL][coordR] = 0;
flag--;
coordL -= direction[control][0];
coordR -= direction[control][1];
//control为7时已无其他走法,不必再试
if (control < 7) {
control++;
}
else {
break;
}
//继续尝试其他走法
while (true) {
if (map[coordL + direction[control][0]][coordR + direction[control][1]] != 1
&& coordL < 8 && coordL >= 0 && coordR < 8 && coordR >= 0) {
coordL += direction[control][0];
coordR += direction[control][1];
map[coordL][coordR] = 1;
flag++;
step = flag;
}
else {
if (control < 8) {
control++;
}
else {
break;
}
}
}
}
else {
break;
}
}
}
//走完时
else {
cout << "第" << step << "步的走法为" << "[" << direction[control][0] << "," << direction[control][1] << "]" << endl;
}
}
int main() {
//初始化棋盘
int map[8][8];
for (int i = 0; i < 8; i++) {
for (int j = 0; j < 8; j++) {
map[i][j] = 0;
}
}
//初始化坐标,行列,就不设置检测了
int coordL, coordR;
scanf_s("%d %d", &coordL, &coordR);
//走起
solve(map,coordL,coordR);
return 0;
}
#include<iostream>
using namespace std;
//棋盘
int map[8][8];
//马步方向
int direction[8][2] = { {1,2},{1,-2},{-1,2},{-1,-2},{2,1},{2,-1},{-2,1},{-2,-1} };
//坐标,行列
int coordL, coordR;
//已走的格子数
int flag = 0;
void solve() {
//步数
int step = 0;
//方向控制
int control = 0;
//下一步的坐标
int fcoordL;
int fcoordR;
//未走完时
if (flag < 64) {
//确保每次递归如果能走必须走一步
while (true) {
fcoordL = coordL + direction[control][0];
fcoordR = coordR + direction[control][1];
//如果下一步可走,则走
if (fcoordL < 8 && fcoordL >= 0 && fcoordR < 8 && fcoordR >= 0&& map[fcoordL][fcoordR] != 1) {
coordL += direction[control][0];
coordR += direction[control][1];
//标记已经走过
map[coordL][coordR] = 1;
flag++;
step = flag;
break;
}
//如果下一步不可走,则切换方向
else {
if (control < 8) {
control++;
}
else {
break;
}
}
}
//继续走下一步,并且在下一步无法进行时回退继续尝试其他走法
while (true) {
//进入下一步
solve();
//若下一步失败,则回退
if (flag < 64) {
map[coordL][coordR] = 0;
flag--;
coordL -= direction[control][0];
coordR -= direction[control][1];
//control为7时已无其他走法,不必再试
if (control < 7) {
control++;
}
else {
break;
}
//继续尝试其他走法
while (true) {
fcoordL = coordL + direction[control][0];
fcoordR = coordR + direction[control][1];
if (fcoordL < 8 && fcoordL >= 0 && fcoordR < 8 && fcoordR >= 0 && map[fcoordL][fcoordR] != 1) {
coordL += direction[control][0];
coordR += direction[control][1];
map[coordL][coordR] = 1;
flag++;
step = flag;
break;
}
else {
if (control < 8) {
control++;
}
else {
break;
}
}
}
}
else {
break;
}
}
}
//走完时
else {
cout << "第" << step << "步的走法为" << "[" << direction[control][0] << "," << direction[control][1] << "]" << endl;
}
}
int main() {
//初始化棋盘
for (int i = 0; i < 8; i++) {
for (int j = 0; j < 8; j++) {
map[i][j] = 0;
}
}
scanf_s("%d %d", &coordL, &coordR);
//走起
solve();
return 0;
}