美文网首页
马踏棋盘算法2018-06-09

马踏棋盘算法2018-06-09

作者: Andydufresnegh | 来源:发表于2018-06-09 00:29 被阅读0次

/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;
}

相关文章

  • 马踏棋盘算法2018-06-09

    /June 8,2018 Author GH //该代码用递归实现了马踏棋盘算法//反思,在实现过程中滥用全局变量...

  • 马踏棋盘java实现 详解注释

    最近对算法方面有点兴趣马踏棋盘有用到贪心算法 回溯算法 回溯是当前棋盘状态 54时下一步已经没地方了 马儿踏完整...

  • 马踏棋盘算法

    最近在学习深度优先搜索算法,接触到了马踏棋盘,决定尝试一下。 涉及算法:递归,回溯法,深度优先搜索算法 题目需求:...

  • 马踏棋盘算法

    由于今天的马踏棋盘算法并不是使用OC编写,所以,今天的标题也就不是"使用OC....."了,下面直接开始我们的正题...

  • 马踏棋盘算法

    问题定义: 将马随机放在国际象棋的Board[0~7][0~7]的某个方格中,马按走棋规则进行移动。,走遍棋盘上全...

  • 马踏棋盘(贪心算法)

    需求 将马随机放在国际象棋的Board[0~7][0~7]的某个方格中,马按走棋规则进行移动。,走遍棋盘上全部64...

  • 马踏棋盘(结合贪心)

    将能选择的点进行递归,不通就回溯 结合贪心算法优化将可跳转的点的下一步进行非递减排序,这样可以尽量少的回溯

  • 自学Python:马踏棋盘

    国际象棋的棋盘为8×8的方格棋盘。现将“马”放在任意指定的方格中,按照“马”走棋的规则将“马”进行移动。 要求每个...

  • 图的深度优先遍历和马踏棋盘算法

    图的深度优先遍历思想 图的遍历通常有两种遍历次序方案: 深度优先遍历和广度优先遍历。深度优先遍历(DepthFir...

  • Java基于分治算法实现的棋盘覆盖问题示例

    Java基于分治算法实现的棋盘覆盖问题示例 本文主要介绍了ava基于分治算法实现的棋盘覆盖问题,简单描述了棋盘覆盖...

网友评论

      本文标题:马踏棋盘算法2018-06-09

      本文链接:https://www.haomeiwen.com/subject/afbzsftx.html