马踏棋盘算法2018-06-09

/June 8,2018 Author GH /
/
该代码用递归实现了马踏棋盘算法
/
/反思,在实现过程中滥用全局变量导致了许多fatal的错误!/
/此外代码的算法效率还有待改进——————可以将回退的代码进行重构 Line62~110/

include <stdio.h>

include <stdlib.h>

int move_x_array[8] = {1,2,2,1,-1,-2,-2,-1}; //x方向移动步骤 (x>0向下,x<0向上)
int move_y_array[8] = {2,1,-1,-2,-2,-1,1,2}; //y方向的移动步骤(y>0向右, y<0向左)
int L,C;
int Whether_passing[8][8] = {{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}}; //标志位,0表示没有走过,1表示已经走过;

int Cheese_value[8][8] = {{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 key; //Find_next()的返回值
int Kind = 0,layer = 0; //Kind是合格方案个数,layer当前所递归的层数;
void printf_cheese(void) //目的是判断是否棋盘上所有位置都被走过,如果没有则跳过,否则将当前情况打印出来
{
int line,column;
for(line=0;line<8;line++)
{
for(column=0;column<8;column++)
{
if(Cheese_value[line][column]<10) //使输出更加规整,列之间对齐;
{
printf("%d ",Cheese_value[line][column]);
}
else
{
printf("%d ",Cheese_value[line][column]);
}
}
printf("\n\n");
}
//printf("%d",move_y_array[4]);
}
int Find_next(int move_x,int move_y) //核心函数
{
int inner_counter =0,i; //inner_counter用于判断该位置是否已经无路可走,
int Adds_value = 0,mid_variable =0; //mid_variable用于判断是否需要回退一层,Adds_value用于计算总和;
layer++; //递归层数
if(move_x<0 || move_x>7 || move_y<0 || move_y>7) //判断位置是否在棋盘内
{
layer--;
return 0;
}
else if(Whether_passing[move_x][move_y]==1) //判断 是否已经走过
{
layer--;
return 0;
}
else
{
Cheese_value[move_x][move_y] = layer; //把当前步骤 赋值给Cheese_value数组;
Whether_passing[move_x][move_y] = 1; //标记 为已经走过
for(i=0;i<8;i++)
{
key = Find_next(move_x+move_x_array[i],move_y+move_y_array[i]);
if(key == 0)
{
inner_counter++;
}
} //递归
for(L=0;L<8;L++)
{
for(C=0;C<8;C++)
{
Adds_value += Cheese_value[L][C];
}
} //获取当前所有位置的值的总和;
if(inner_counter == 8) //回退一层
{
layer--;
}
if(inner_counter == 8 && Adds_value==2080 )// && && Adds_value < 2080
{
//inner_counter = 0;
Kind++;
printf("Kind=%d ###layer=%d ###Add_value= %d\n",Kind,layer+1,Adds_value); //总的种类数量
printf_cheese(); //伪代码,执行操作operator ,目的是判断是否棋盘上所有位置都被走过,如果没有则跳过,否则将当前情况打印出来
printf("\n");
}
if(inner_counter == 8 && layer==0)
{
printf("Game over;");
exit(0);
}
mid_variable = inner_counter; //因为inner_counter不得不清零所已用mid_variable来存储它的值;
inner_counter = 0;
Cheese_value[move_x][move_y] = 0; //步骤清零
Whether_passing[move_x][move_y]=0; //标志位清零
if(mid_variable == 8){ //如果无路可走必须要返回0,不然后面程序将不会回退一层,即layer--;不会执行
mid_variable = 0;
return 0;
}
else
return 1;
}
}
int main()
{
int start_x = 7,start_y = 0; //起始位置
Find_next(start_x,start_y);
return 0;
}

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • C语言的学习要从基础开始,这里是100个经典的算法-1C语言的学习要从基础开始,这里是100个经典的 算法 题目:...
    Poison_19ce阅读 1,201评论 0 0
  • Lua 5.1 参考手册 by Roberto Ierusalimschy, Luiz Henrique de F...
    苏黎九歌阅读 13,967评论 0 38
  • (一) 不知道大家都有没有这样的感受,和有些人在一起就是放不开,换一群人,换一种环境却能变得自在起来。 之前一直以...
    小维维_d991阅读 89评论 0 0
  • 特别关注: 蒙城巨力向两家贫困生爱心捐款8620元! 陆建军、张奎摄影报道: 7月21日上午8时30分,蒙城县巨力...
    庄周乙未豪客阅读 674评论 0 0
  • 小婴儿学走路是怎样的?不断跌倒,不断爬起,他从不会担心自己的能力就只有这些,害怕再次失败而变得消极,只想着怎么走起来。
    1点学堂阅读 228评论 0 0