跳马问题:
设计一个国际象棋的跳马演示程序,
基本要求:将马随机放进8*8的棋盘内,按马的行走规则,每个方格进入一次.
走遍64个方格,将数字依次填入8*8个方格内,并输出.
较高要求:1.求出从某一起点出发的多条以致全部行走路线.
2.每次选择位置的"最佳策略",尽量减少回溯次数
10 个解决方案
#1
这个问题我也很感兴趣哦,不知哪位大虾能解答呀
#2
GOOGLE
#3
C++版的数据结构书上有例子,还有就是常见的算法书上也有
#4
马的遍历问题。
2.每走一步都选择出口最少的位置。用个子函数计算每一点的出口数。
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();
}
}
#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.每走一步都选择出口最少的位置。用个子函数计算每一点的出口数。
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();
}
}
#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
数据结构中最容易想到的是迷宫问题,就是用回溯法的那个,但用迷宫问题来解需要的时间太长;
要做个高效的程序的话要用数据结构中的图的遍历;
要做个高效的程序的话要用数据结构中的图的遍历;