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();
}
总算还是完成了,哈哈。。。。