"马"可以不重复跳完所有格子

http://www.oiegg.com/viewthread.php?tid=1717664&extra=&page=1

(1) 要求:在国际象棋8*8棋盘上,按照国际象棋规则中马的行走规则,实现从任意初始位置,每个方格只进入一次,走遍棋盘上全部64个方格。编制程序,求出马的行走路线,并按照求出的行走路线,将数字1,2,3…,64依次填入一个8*8的方阵,并输出它的行走路线。
(2) 输入:任意一个起始的位置:
(3) 输出:无重复踏遍棋盘的结果,以数字1-64表示行走路线


#include<stdio.h>
#include<stdlib.h>
int board[8][8];
int Htry1[8]={1,-1,-2,2,2,1,-1,-2};
int Htry2[8]={2,-2,1,1,-1,-2,2,-1}; //存储马各个出口位置相对当前位置列下标的增量数组
struct Stack
{ int i;
int j;
int director;
}stack[100];
int top=-1;
//探寻路径函数模块
int TryPath(int i,int j){
int find,number,min;
int i1,j1,h,k,s;
int a[8],b1[8],b2[8],d[8];
while(top>-1)
{
for(h=0;h<8;h++) //用数组a[8]记录当前位置的下一个位置的可行路径的条数
{
number=0;
i=stack[top].i+Htry1[h];
j=stack[top].j+Htry2[h];
b1[h]=i;
b2[h]=j;
if(board[i][j]==0&&i>=0&&i<8&&j>=0&&j<8)
{
for(k=0;k<8;k++)
{
i1=b1[h]+Htry1[k];
j1=b2[h]+Htry2[k];
if(board[i1][j1]==0&&i1>=0&&i1<8&&j1>=0&&j1<8)
number++;
}
a[h]=number;
}
}
for(h=0;h<8;h++) //根据可行路径条数小到大按下标排序放入数组 d[8]中
{
min=9;
for(k=0;k<8;k++)
if(min>a[k])
{
min=a[k];
d[h]=k;
s=k;
}
a[s]=9;
}
if(top>=63) //如果走完整个棋盘返回1
return (1);
find=0; //表示没有找到下一个位置
for(h=0;h<8;h++) //向八个方向进行探寻
{
i=stack[top].i+Htry1[d[h]];
j=stack[top].j+Htry2[d[h]];
if(board[i][j]==0&&i>=0&&i<8&&j>=0&&j<8) //如果找到下一位置
{
find=1; //表示找到下一个位置
break;
}
}
if(find==1) //如果找到下一个位置进栈
{
top++; //栈指针前移进栈
stack[top].i=i;
stack[top].j=j;
board[i][j]=top+1; //标记棋盘
}
else
{
board[stack[top].i][stack[top].j]=0; //清除棋盘的标记
top–; //栈指针前移退栈
}
}
return (0);
}
//输出路径函数模块
void Display() {
int i,j;
for(i=0;i<8;i++)
{
for(j=0;j<8;j++)
printf(“%d\t”,board[i][j]); //输出马儿在棋盘上走过的路径
printf(“\n\n”);
}
printf(“\n”);
}
//起始坐标函数模块
void InitLocation(int xi,int yi) {
int x,y;
top++;
stack[top].i=xi;
stack[top].j=yi;
board[xi][yi]=top+1;
x=stack[top].i;
y=stack[top].j;
if(TryPath(x,y))
Display();
else printf(“无解”);
}
//主程序模块
int main()
{
int x,y;
int i,j;
printf(“*************************马踏棋盘****************************\n\n”);
for(;;)
{
printf(“请输入起始位置的横坐标:x= “);
scanf(“%d”,&x);
printf(“请输入起始位置的纵坐标:y= “);
scanf(“%d”,&y);
printf(“\n”);
if(x>=0&&x<=7&&y>=0&&y<=7)break; //1<=x<=7且1<=y<=7,break退出整个循环,否则无限循环
printf(“输入错误!!!请重新输入\n\n”);
}
printf(“马的行走路径如下:\n\n”);
InitLocation(x,y);
system(“pause”);
return(0);
}

深度优先搜索DFS)A*记忆化搜索或者慢点的dfs,bfs(虽然很慢。。。)可以搜出来的  遍历和迭代……

http://tieba.baidu.com/p/4604763992



其余相关的参考():
https://zhidao.baidu.com/question/199788408652928965.html

http://wenku.baidu.com/link?url=qeF3h1bjQHLe_2g98FsyAEaitgg5bGVU6z8pintNsUm1EgzcQyt_ONd7Cp_EfsYFIyv4kQLGItH0X_IyWpkpb44RydrfZ0EJ1L-ix8Wv2Uq

http://wenku.baidu.com/link?url=mrJFSKcWXqjfONbUDULxihaRlGUod0lYInYzzt5CCqIfBYtqf8R9xmfTuBJbkVrBtbbgOTNMW18UYvZ85JPLGFtvDUc2U8vNe43jyedi1X7

http://wenku.baidu.com/link?url=1gl7kL-NEc71lehqM_d57hTQucfPe3Nwdwk2qQcSgR9u5KtzptDuGl4tDaQMQMvAu8W6RFyGuJ_MU8hoPdx0e8FByo2NhPKihlsv_0-JuFO

http://m.blog.csdn.net/article/details?id=9473183

http://blog.sina.com.cn/s/blog_14d68e5a70102vn7c.html

http://wenku.baidu.com/link?url=hRa_D0Qy7ZfmOWqht58APuh5vN7P6Mo1rBtwpskwXkY0MPzeNcdWn2gqQNv01WFnWbE9b3RX9yQpWw8a51kFr1CZ2MMje_-iVbSSUHHZkvy


    原文作者:骑士周游问题
    原文地址: https://blog.csdn.net/tianzhijiaozi19/article/details/53054858
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞