马踏棋盘
来源:互联网 发布:女生讨厌肌肉男 知乎 编辑:程序博客网 时间:2024/04/30 20:17
基本要求
将马放到国际象棋的8*8棋盘board上的某个方格中,马按走棋规则进行移动,要求每个方格只进入一次,走遍棋盘上的64个方格,编写递归程序,求出马的行走路线,并按求出路线,将数字12 3.。。。。64依次填入一个8*8的方阵,输出之
测试数据
#include<stdio.h>
#include<stdlib.h>
#define STACK_SIZE 100 /*存储空间初始量分配*/
#define STACKINCREMENT 10/*存储空间分配增量*/
#define N 8/*棋盘大小*/
int weight[N][N];/*各点权值*/
int Board[N][N][8];/*按各点权值递升存放待走方向,每点8个*/
typedef struct//点的位置
{
int x;
int y;
}PosType;
typedef struct//栈的元素
{
int ord;//步骤
PosType seat;//点的位置
int di;//马的走向
}ElemType;
typedef struct
{
ElemType *base;
ElemType *top;
int stacksize;
}SqStack;
SqStack s;
int IniStack()//初始化一个空栈
{
s.base =(ElemType*)malloc(STACK_SIZE*sizeof(ElemType));
if(!s.base ) return 0;
s.top =s.base ;
s.stacksize =STACK_SIZE;
return 1;
}
ElemType GetTop()//取栈顶值
{
if(s.top ==s.base )
return *(s.top -1);
}
void Push(ElemType elem)//将元素放入栈中,elem为要放入的元素
{
*s.top++=elem;
}
int Pop(ElemType *elem)//将栈顶元素出栈
{
if(s.top ==s.base ) return 0;
*elem=*--s.top ;
return 1;
}
int StackEmpty()//判断栈空
{
if(s.top ==s.base ) return 1;
else return 0;
}
void OutputPath()
{
int i,f,k;
SqStack s1=s;
int path[N][N];
for(i=0;s1.top!=s1.base;i++)//
{
path[(*s1.base).seat.x][(*s1.base).seat.y]=i+1;
++s1.base;
}
for(f=0;f<N;f++)//输出马走的路径
{
printf("\n");
for(k=0;k<N;k++)
printf("\t%d",(path[f][k]));
}
printf("\n");
}
int Pass(PosType curpos)//判断当前位置是否合法
{
SqStack s1=s;
if(curpos.x<0||curpos.x >(N-1)||curpos.y<0||curpos.y >(N-1))
return 0;
for(;s1.top!=s1.base;)
{
--s1.top;
if(curpos.x ==(*s1.top).seat.x&&curpos.y ==(*s1.top).seat.y)//将当前位置与之前位置比较,若重复则说明位置不行
return 0;
}
return 1;
}
PosType NextPos(PosType curpos,int direction)//下一点的8个选择方向
{
switch(direction)
{
case 1:curpos.x+=1;curpos.y-=2;break;
case 2:curpos.x+=2;curpos.y-=1;break;
case 3:curpos.x+=2;curpos.y+=1;break;
case 4:curpos.x+=1;curpos.y+=2;break;
case 5:curpos.x-=1;curpos.y+=2;break;
case 6:curpos.x-=2;curpos.y+=1;break;
case 7:curpos.x-=2;curpos.y-=1;break;
case 8:curpos.x-=1;curpos.y-=2;break;
}
return curpos;//返回新点
}
void setweight()//求个点权值
{
int i,j,k;
PosType m;
ElemType elem;
for(i=0;i<N;i++)
{
for(j=0;j<N;j++)
{
elem.seat.x=i;
elem.seat.y=j;
weight[i][j]=0;
for(k=0;k<8;k++)
{
m=NextPos(elem.seat,k+1);
if(m.x>=0&&m.x<N&&m.y>=0&&m.y<N)
weight[i][j]++;//(i,j)有几个方向移动
}
}
}
}
void setmap()//个点的8个方向按权值递增排列
{
int a[8];
int i,j,k,m,min,s,h;
PosType n1,n2;
for(i=0;i<N;i++)
{
for(j=0;j<N;j++)
{
for(h=0;h<8;h++)//用数组a[8]记下当前位置的下一位置可行路径条数
{
n2.x=i;
n2.y =j;
n1=NextPos(n2,h+1);
if(n1.x>=0&&n1.x<N&&n1.y>=0&&n1.y<N)
a[h]=weight[n1.x][n1.y ];
else
a[h]=0;
}
for(m=0;m<8;m++)//对方向索引权值升序排列存入Board[N][N][8],不能到达方向排最后
{
min=9;
for(k=0;k<8;k++)
if(min>a[k])
{
min=a[k];
Board[i][j][m]=k;
s=k;
}
a[s]=9;//选过的设为9
}
}
}
}
int HorsePath(PosType start)//马走过的路径
{
PosType curpos;
int horsestep=0,off;
ElemType elem;
curpos=start;
do
{
if(Pass(curpos))
{
horsestep++;
elem.di=0;
elem.ord=horsestep;
elem.seat=curpos;
Push(elem);
if(N*N==horsestep)
return 1;
off=Board[elem.seat.x][elem.seat.y][elem.di]+1;
curpos=NextPos(elem.seat,off);
}
else
{
if(!StackEmpty())
{
while(!StackEmpty()&&elem.di==8)
{
Pop(&elem);
if(!StackEmpty())
{
elem=GetTop();
horsestep=elem.ord;
}
}
if(!StackEmpty()&&elem.di<8)
{
Pop(&elem);
off=Board[elem.seat.x][elem.seat.y][++elem.di];
curpos=NextPos(elem.seat,off+1);
Push(elem);
}
}
}
}while(!StakEmpty());
printf("走不通");
return 0;
}
void main()
{
PosType start;
InitStak();
printf("输入起始位置:(0-7)\nX:");
scanf("%d",&start.x );
printf("Y:");
scanf("%d",&start.y );
setweight();
setmap();
HorsePath(start);
OutputPath();
}
- 马踏棋盘问题
- 马踏棋盘
- 马踏棋盘
- 马踏棋盘
- 【马踏棋盘】 数据结构
- 栈--马踏棋盘
- 马踏棋盘
- 求助-马踏棋盘
- 马踏棋盘算法
- 马踏棋盘
- 马踏棋盘问题
- 马踏棋盘
- 马踏棋盘
- 马踏棋盘
- 马踏棋盘
- 数据结构---马踏棋盘
- 马踏棋盘
- 马踏棋盘
- 再谈hashCode和equals
- 状态机的实现
- 内存位置不在堆叠
- 编程人员必须会用的软件
- 行动中的栈
- 马踏棋盘
- servlet里获取jsp页面select的option值
- 【从0开始学香蕉派】序列之12:FTP服务器-方便大家
- 贝叶斯文本分类简介
- Visual Studio 2013 Update 3
- IntelliJ IDEA快捷键
- 无限制递归
- 如何让console程序以全屏窗口运行
- case表达式输入参数分析的一个比较好的案例