马踏棋盘

马踏棋盘

问题描述:

  马的遍历问题。在8×8方格的棋盘上,从任意指定方格出发,为马寻找一条走遍棋盘每一格并且只经过一次的一条路径。

解决方案:

   1.建立一个栈,定义其栈顶指针和栈底指针,以及栈的大小。

   2.将马的初始步压入栈中,计算其八个方向的权值,各点的八个方向按权值升序排列。

   3.马向最小权值方向走,得到下一步,重复步骤二。

   4.某步的下一步超出棋盘,则重新走,这一步出栈,由前一步重新选择方向。

   5.最后,根据桟中内容将马的行走路线填入方阵。



#include<stdlib.h>

#include<stdio.h>


#define STACK_SIZE 100
#define STACKINCREMENT 10
#define N 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;
void OutputPath();                                   //输出路径       
int Pass(PosType curpos);                            //判断当前是否可走 
PosType NextPos(PosType curpos,int direction);      //找下一个可走的路 
void setweight();                                     //统计每一个下一个方向的个数点 
void setmap();                                        //按权值排序 
int HorsePath(PosType start);                         //记录路径 


int weight[N][N];
int Board [N][N][8];
 
SqStack s;


int InitStack()                     //初始化一个栈         
{
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) 
   exit(0);
return *(s.top-1);
}
void Push(ElemType 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++)  
{
Sleep(10);
    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)
{
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]++; 
}

}
}
}


void setmap()
{
   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++)
    {
    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++)
  {
  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;
  }
}
   } 



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(!StackEmpty());
printf("走不通");
return 0;
}
void main()
{
PosType start;
InitStack();
printf("输入起始位置: (0_7)\nX:");
scanf("%d",&start.x);
printf("Y:");
scanf("%d",&start.y);
setweight();
setmap();
HorsePath(start);
OutputPath();
}

猜你喜欢

转载自blog.csdn.net/los_ATend/article/details/53201833