请问高手跳马问题的算法或者源程序

时间:2022-12-23 03:46:40
请问跳马问题的算法:
跳马问题:
    设计一个国际象棋的跳马演示程序,
    基本要求:将马随机放进8*8的棋盘内,按马的行走规则,每个方格进入一次.
走遍64个方格,将数字依次填入8*8个方格内,并输出.
    较高要求:1.求出从某一起点出发的多条以致全部行走路线.
              2.每次选择位置的"最佳策略",尽量减少回溯次数

10 个解决方案

#1


这个问题我也很感兴趣哦,不知哪位大虾能解答呀

#2


GOOGLE

#3


C++版的数据结构书上有例子,还有就是常见的算法书上也有

#4


马的遍历问题。
2.每走一步都选择出口最少的位置。用个子函数计算每一点的出口数。

#5


以前看到的:作者忘了

#include<iostream.h>
#include<stdio.h>
#include<conio.h>

int deltai[]={2,1,-1,-2,-2,-1,1,2}; 
int deltaj[]={1,2,2,1,-1,-2,-2,-1}; 

int board[8][8]; 

int exitn(int i,int j,int s,int a[])
{
int i1,j1,k,count;
for(count=k=0;k<8;k++)
{

i1=i+deltai[(s+k)%8];
j1=j+deltaj[(s+k)%8];

if(i1>=0&&i1<8 && j1>=0 && j1<8 && board[i1][j1]==0)
a[count++]=(s+k)%8;
}
return count;
}

/*选择出口数最少的出口,s为顺序选择的开始序号*/
int next(int i,int j,int s)
{
int m,k,kk,min,a[8],b[8],temp;
m=exitn(i,j,s,a);
if(m==0) 
return -1;

for(min=9,k=0;k<m;k++)
{
temp=exitn(i+deltai[a[k]],j+deltaj[a[k]],s,b);
if(temp<min)
{
min=temp;
kk=a[k];
}
}
return kk;
}

void main()
{
cout<<"========== 马的遍历问题 ==========="<<endl;
cout<<"数字是代表该格子是第几步走到的:"<<endl<<endl;
cout<<"按任意键可查看其他走法:"<<endl<<endl;

int sx,sy,i,j,step,no,start;
for(sx=0;sx<8;sx++)
for(sy=0;sy<8;sy++)
{
start=0; 
do
{
for(i=0;i<8;i++)
for(j=0;j<8;j++)
board[i][j]=0;
board[sx][sy]=1;
i=sx;
j=sy;
for(step=2;step<=64;step++)
{
if((no=next(i,j,start))==-1)
break;
i+=deltai[no];
j+=deltaj[no];
board[i][j]=step;
}
if(step>64)
break;
start++;
}while(step<=64);

for(i=0;i<8;i++)
{
     for(j=0;j<8;j++)
cout<<"--"<<board[i][j];
cout<<"--"<<endl;
}
cout<<endl;
getch();
}

 

#6


想问一下,数据结构中的什么算法跟这个跳马程序相似???

#7


迷宫问题和这个一样吧

#8


深度优先搜索,广度优先搜索都可以,用什么数据结构,就看你自己了

#9


《系统设计师教程》上有。

#10


数据结构中最容易想到的是迷宫问题,就是用回溯法的那个,但用迷宫问题来解需要的时间太长;
要做个高效的程序的话要用数据结构中的图的遍历;

#1


这个问题我也很感兴趣哦,不知哪位大虾能解答呀

#2


GOOGLE

#3


C++版的数据结构书上有例子,还有就是常见的算法书上也有

#4


马的遍历问题。
2.每走一步都选择出口最少的位置。用个子函数计算每一点的出口数。

#5


以前看到的:作者忘了

#include<iostream.h>
#include<stdio.h>
#include<conio.h>

int deltai[]={2,1,-1,-2,-2,-1,1,2}; 
int deltaj[]={1,2,2,1,-1,-2,-2,-1}; 

int board[8][8]; 

int exitn(int i,int j,int s,int a[])
{
int i1,j1,k,count;
for(count=k=0;k<8;k++)
{

i1=i+deltai[(s+k)%8];
j1=j+deltaj[(s+k)%8];

if(i1>=0&&i1<8 && j1>=0 && j1<8 && board[i1][j1]==0)
a[count++]=(s+k)%8;
}
return count;
}

/*选择出口数最少的出口,s为顺序选择的开始序号*/
int next(int i,int j,int s)
{
int m,k,kk,min,a[8],b[8],temp;
m=exitn(i,j,s,a);
if(m==0) 
return -1;

for(min=9,k=0;k<m;k++)
{
temp=exitn(i+deltai[a[k]],j+deltaj[a[k]],s,b);
if(temp<min)
{
min=temp;
kk=a[k];
}
}
return kk;
}

void main()
{
cout<<"========== 马的遍历问题 ==========="<<endl;
cout<<"数字是代表该格子是第几步走到的:"<<endl<<endl;
cout<<"按任意键可查看其他走法:"<<endl<<endl;

int sx,sy,i,j,step,no,start;
for(sx=0;sx<8;sx++)
for(sy=0;sy<8;sy++)
{
start=0; 
do
{
for(i=0;i<8;i++)
for(j=0;j<8;j++)
board[i][j]=0;
board[sx][sy]=1;
i=sx;
j=sy;
for(step=2;step<=64;step++)
{
if((no=next(i,j,start))==-1)
break;
i+=deltai[no];
j+=deltaj[no];
board[i][j]=step;
}
if(step>64)
break;
start++;
}while(step<=64);

for(i=0;i<8;i++)
{
     for(j=0;j<8;j++)
cout<<"--"<<board[i][j];
cout<<"--"<<endl;
}
cout<<endl;
getch();
}

 

#6


想问一下,数据结构中的什么算法跟这个跳马程序相似???

#7


迷宫问题和这个一样吧

#8


深度优先搜索,广度优先搜索都可以,用什么数据结构,就看你自己了

#9


《系统设计师教程》上有。

#10


数据结构中最容易想到的是迷宫问题,就是用回溯法的那个,但用迷宫问题来解需要的时间太长;
要做个高效的程序的话要用数据结构中的图的遍历;