这个是我的代码#include <stdio.h>
#include <time.h>
#define X 8
#define Y 8
int chess[X][Y]; //记录棋盘
void print() {
int i, j;
for (i = 0; i < X; i++) {
for (j = 0; j < Y; j++) {
printf("%2d ", chess[i][j]);
}
putchar('\n');
}
}
//根据xy坐标,判断指定位置可不可走,如果可走改变传入的x y坐标
int decide_next(int* px, int* py, int count) {
int x = *px, y = *py;
switch (count) {
case 0:
if (x + 2 < X && y - 1 >= 0 && chess[x + 2][y - 1] == 0) {
*px = x + 2;
*py = y - 1;
return 1;
}
break;
case 1:
if (x + 2 < X && y + 1 < Y && chess[x + 2][y + 1] == 0) {
*px = x + 2;
*py = y + 1;
return 1;
}
break;
case 2:
if (x + 1 < X && y - 2 >= 0 && chess[x + 1][y - 2] == 0) {
*px = x + 1;
*py = y - 2;
return 1;
}
break;
case 3:
if (x + 1 < X && y + 2 < Y && chess[x + 1][y + 2] == 0) {
*px = x + 1;
*py = y + 2;
return 1;
}
break;
case 4:
if (x - 2 >= 0 && y - 1 >= 0 && chess[x - 2][y - 1] == 0) {
*px = x - 2;
*py = y - 1;
return 1;
}
break;
case 5:
if (x - 2 >= 0 && y + 1 < Y && chess[x - 2][y + 1] == 0) {
*px = x - 2;
*py = y + 1;
return 1;
}
break;
case 6:
if (x - 1 >= 0 && y - 2 >= 0 && chess[x - 1][y - 2] == 0) {
*px = x - 1;
*py = y - 2;
return 1;
}
break;
case 7:
if (x - 1 >= 0 && y + 2 < Y && chess[x - 1][y + 2] == 0) {
*px = x - 1;
*py = y + 2;
return 1;
}
break;
default:
break;
}
return 0;
}
// 获得棋子的路径
int setHorse(int x, int y, int tag){
int x1, y1, resule = 0, count = 0;
// tag记录轨迹
chess[x][y] = tag;
if (tag == 62) {
tag = 62;
}
// 如果tag等于64打印棋盘
if (tag == X * Y) {
return 1;
}
// 递归进入下一个坐标
while (count < 8){
// 尝试路径是否能走
resule = decide_next(&x1, &y1, count);
if (!resule) {
count += 1;
}
for (x1 = x, y1 = y; resule == 0 && count < 8; count += 1) {
resule = decide_next(&x1, &y1, count);
}
// 返回1表示成功找到路径;对新的点进行尝试
if (setHorse(x1, y1, tag + 1))
{
return 1;
}
// 如果失败并且有没尝试的路径,回到上一步重新尝试
count += 1;
}
// 如果全部路径都尝试过,并且没有返回1,说明这个点没有可行的路径,回到上一步并且去除痕迹
chess[x][y] = 0;
return 0;
}
int main(void){
int i, j, x, y;
clock_t start, finish;
for (i = 0; i < X; i++) {
for (j = 0; j < Y; j++){
chess[i][j] = 0;
}
}
// 获取初始坐标;建议(2,0)
printf("请输入初始坐标(x y):");
scanf_s("%d %d", &x, &y);
// 记录开始时间
start = clock();
if (setHorse(x, y, 1)) {
print();
}
else{
printf("可惜无解!\n");
}
// 记录结束时间
finish = clock();
printf("\n本次计算一共耗时∶%f秒\n", (double)(finish - start) / CLOCKS_PER_SEC);
return 0;
}
这一段代码// 获得棋子的路径
int setHorse(int x, int y, int tag){
int x1, y1, resule = 0, count = 0;
// tag记录轨迹
chess[x][y] = tag;
if (tag == 62) {
tag = 62;
}
// 如果tag等于64打印棋盘
if (tag == X * Y) {
return 1;
}
// 递归进入下一个坐标
while (count < 8){
// 尝试路径是否能走
resule = decide_next(&x1, &y1, count);
if (!resule) {
count += 1;
}
for (x1 = x, y1 = y; resule == 0 && count < 8; count += 1) {
resule = decide_next(&x1, &y1, count);
}
// 返回1表示成功找到路径;对新的点进行尝试
if (setHorse(x1, y1, tag + 1))
{
return 1;
}
// 如果失败并且有没尝试的路径,回到上一步重新尝试
count += 1;
}
// 如果全部路径都尝试过,并且没有返回1,说明这个点没有可行的路径,回到上一步并且去除痕迹
chess[x][y] = 0;
return 0;
}
改成nt setHorse(int x, int y, int tag)
{
int x1 = x, y1 = y, flag = 0, count = 0;
// tag记录轨迹
chess[x][y] = tag;
// 如果tag等于64退出程序
if (tag == X*Y)
{
return 1;
}
// 如果可以走,那么flag为1
flag = next(&x1, &y1, count);
// 否则尝试其他路径
while (flag == 0 && count < 7)
{
count += 1;
flag = next(&x1, &y1, count);
}
// 递归进入下一个坐标
while (flag)
{
// 返回1表示成功找到落脚点
if (setHorse(x1, y1, tag+1))
{
return 1;
}
// 否则从上一步重新尝试
x1 = x;
y1 = y;
count += 1;
flag = next(&x1, &y1, count);
while (flag == 0 && count < 7)
{
count += 1;
flag = next(&x1, &y1, count);
}
}
if (flag == 0)
{
chess[x][y] = 0;
}
return 0;
}
就可以。不知道问题在哪里。想知道是哪里错误了? |