C语言之算法初步(骑士周游世界)

#include<iostream>

using namespace std;

#define N 6

int ditu[N][N] = 

{

{0, 0, 0, 0, 0, 0},

{0, 0, 0, 0, 0, 0},

{0, 0, 0, 0, 0, 0},

{0, 0, 0, 0, 0, 0},

{0, 0, 0, 0, 0, 0},

{0, 0, 0, 0, 0, 0}

};

int flag = 0;

int go(int x, int y)

{

flag++;

ditu[x][y] = flag; //将骑士走的路径记录

if (flag >= (N * N)) //判断是否走完整个地图

return flag;

//8方向探路

if ((((x - 2) >= 0) && ((x - 2) < N)) && (((y - 1) >= 0) && ((y - 1) < N)) && (ditu[x - 2][y - 1] == 0))

go(x - 2, y - 1);

if ((((x - 2) >= 0) && ((x - 2) < N)) && (((y + 1) >= 0) && ((y + 1) < N)) && (ditu[x - 2][y + 1] == 0))

go(x - 2, y + 1);

if ((((x - 1) >= 0) && ((x - 1) < N)) && (((y + 2) >= 0) && ((y + 2) < N)) && (ditu[x - 1][y + 2] == 0))

go(x - 1, y + 2);

if ((((x + 1) >= 0) && ((x + 1) < N)) && (((y + 2) >= 0) && ((y + 2) < N)) && (ditu[x + 1][y + 2] == 0))

go(x + 1, y + 2);

if ((((x + 2) >= 0) && ((x + 2) < N)) && (((y + 1) >= 0) && ((y + 1) < N)) && (ditu[x + 2][y + 1] == 0))

go(x + 2, y + 1);

if ((((x + 2) >= 0) && ((x + 2) < N)) && (((y - 1) >= 0) && ((y - 1) < N)) && (ditu[x + 2][y - 1] == 0))

go(x + 2, y - 1);

if ((((x + 1) >= 0) && ((x + 1) < N)) && (((y - 2) >= 0) && ((y - 2) < N)) && (ditu[x + 1][y - 2] == 0))

go(x + 1, y - 2);

if ((((x - 1) >= 0) && ((x - 1) < N)) && (((y - 2) >= 0) && ((y - 2) < N)) && (ditu[x - 1][y - 2] == 0))

go(x - 1, y - 2);

//当没有出路的时候还原

if (flag < (N * N))

{

ditu[x][y] = 0;

flag--;

}

return flag;

}

int main()

{

go(0, 0); //设置从0,0开始出发

//输出路径

for (int i = 0; i < N; i++)

{

for (int j = 0; j < N; j++)

{

printf("%4d",ditu[i][j]);

}

cout<<endl;

}

int x;

cin>>x;

}

不知道是不是递归的原因,还是代码本身有问题,发现当地图大于6*6时结果出不来,先留个记号,有空了继续改进

改进版:

#include <stdio.h>

#include <windows.h>

#pragma comment(lib, "winmm.lib")

#define N 8

int ditu[N][N] = 

{

{0, 0, 0, 0, 0, 0, 0, 0},

{0, 0, 0, 0, 0, 0, 0, 0},

{0, 0, 0, 0, 0, 0, 0, 0},

{0, 0, 0, 0, 0, 0, 0, 0},

{0, 0, 0, 0, 0, 0, 0, 0},

{0, 0, 0, 0, 0, 0, 0, 0},

{0, 0, 0, 0, 0, 0, 0, 0},

{0, 0, 0, 0, 0, 0, 0, 0}

};

int path[N][N];

int flag = 0;

int incX[] = {1,  2,  2, 1, -1, -2, -2, -1};

int incY[] = {-2, -1, 1, 2,  2,  1, -1, -2};

void go(int n, int x, int y)

{

if (n >= (N * N)) //判断是否走完整个地图

{

flag = 1;

path[x][y] = n;

}

if (flag == 1)

return;

path[x][y] = n; //将骑士走的路径记录

ditu[x][y] = 1;

//8方向探路

for (int i = 0; i < 8; i++)

if ((((x + incX[i]) >= 0) && ((x + incX[i]) < N)) && (((y + incY[i]) >= 0) && ((y + incY[i]) < N)) && (ditu[x + incX[i]][y + incY[i]] == 0))

go(n + 1, x + incX[i], y + incY[i]);

ditu[x][y] = 0;

return;

}

int main()

{

int t;

t = timeGetTime();

go(1, 0, 0); //设置从0,0开始出发

printf("Time = %d ms\n\n", timeGetTime() - t);

//输出路径

for (int i = 0; i < N; i++)

{

for (int j = 0; j < N; j++)

{

printf("%4d",path[i][j]);

}

printf("\n");

}

getchar();

}

总算还是完成了,哈哈。。。。

原文地址:https://www.cnblogs.com/ruofengzhishang/p/2179832.html