回 帖 发 新 帖 刷新版面

主题:数据结构:马踏棋盘

楼主  

综合实验八  马踏棋盘
一、    实验目的:
(1)    熟练掌握栈的基本操作及应用。
(2)    利用栈的基本操作,编制实现一个国际象棋的马踏遍棋盘的非递归演示程序。
二、实验内容:
【问题描述】
设计一个国际象棋的马踏遍棋盘的演示程序。
【基本要求】
将马随机放在国际象棋的88棋盘Board88的某个方格中,马按走棋规则进行移动。要求每个方格只进入一次,走遍棋盘上全部64个方格。编制非递归程序,求出马的行走路线,并按求出的行走路线,将数字1,2,…,64依次填入一个88的阵,输出之。
【测试数据】
由读者指定。可自行指定一个马的初始位置
【实现提示】
下页图显示了马位于方格(2,3)时,8个可能的移动位置。
一般来说,当马位于位置(i,j)时,可以走到下列8个位置之一
(I-2, j+1),(I-1,j+2),(I+1,j+2),(I+2,j+1),(I+2,j-1),(I+1,j-2),(I-1,j-2),(I-2j+1)
但是,如果(i,j)靠近棋盘的边缘,上述有些位置可能超出棋盘范围,成为不允许的位置。8个可能位置可以用两个一维数组Htry[10..7]和Htry[20..7]来表示。
位于(I,j)的马可以走到的新位置是在棋盘范围内的(I+Htry1[h],j+Htry2[h]),其中h=0,1,…,7。
每次在多个可走位置中选择其中一个进行试控,其余未曾试过的可走位置必须用适当结构妥善管理,以备试探失败时的“回溯”(悔棋)使用。
【选作内容】
(1)    求出从某一起点出发的多条以至全部行走路线。
(2)    探讨每次选择位置的“最佳策略”,以减少回溯的次数。
(3)    演示寻找行走路线的回溯过程。
以上为题目要求,请各位高手帮忙..急用.. 
我的邮箱是330312611@QQ.com

回复列表 (共3个回复)

沙发



汗~~暑假到了,作业来了.
TO楼主,你搜索一下在这的马踏棋盘.~

板凳

我也想知道啊..尽快啊`````
谢谢了,我的QQ是82585638

3 楼

对于8*8的棋盘是否有可行解,不是容易确定的(大于6就算不了了)。
我的程序由于效率的问题,好象算不出结果,但对于6*6的看出是可以的,并且输出了步骤,程序如下:
#include "iostream.h"
#include "mystack1.h"
#include "stdlib.h"
#define  bian 6
void find(point,stack*);
int  hefa(point);


int  have=0;
bool havego[9][9];
int  a[9],b[9];



void main()
{
    int i,j;
    point di;
    stack *s;
    s=initstack();
        
    for(i=1;i<9;i++)
           for(j=1;j<9;j++)
              havego[i][j]=0;

      have=0;
      a[1]=-2;  b[1]=1 ;         //初始化8个方向
      a[2]=-2;  b[2]=-1;
      a[3]=-1;  b[3]=2 ;
      a[4]=-1;  b[4]=-2;
      a[5]=1 ;  b[5]=2 ;
      a[6]=1 ;  b[6]=-2;
      a[7]=2 ;  b[7]=1 ;
      a[8]=2 ;  b[8]=-1;

      di.x=1;
      di.y=1;
      
      find(di,s);  

}

void find(point p,stack *path)
{
    int i;
    point temp;
    
     for (i=1;i<9;i++)            //可有8个方向
     { 
         temp.x=p.x+a[i];
             temp.y=p.y+b[i];
            if(hefa(temp)&&!havego[temp.x][temp.y])
        {   
             push(path,temp);
         havego[temp.x][temp.y]=1;
             have++;
         if(have==bian*bian)
         {
             cout<<"成功";
             printstack(path);
             exit(0) ;
         }
         else find(temp,path);
        }
     }

     if(i==9)         //无路了
     {  
        pop(path);
        havego[p.x][p.y]=0;
    have--;
    if(have==0)
    {
        cout<<"失败";
         exit(0) ;
    }
     }



int hefa(point p)     //合法则返回1,否则返回0
{
   if(p.x>0&&p.x<=bian&&p.y>0&&p.y<=bian)
         return 1;
         return 0;
}

mystack1.h如下:
#include<iostream.h>
#define maxlen 100

typedef struct point
{
   int x;
   int y; 
}point,elemtype;

typedef struct stack
{
  int len;
  elemtype s[maxlen];
}stack;


stack* initstack()
{
    stack *st;
    st=new stack;   
    st->len=0;
    return st;  
}


void push(stack* st,elemtype object)
{
     if(st->len<maxlen-1)
     {
         st->s[st->len].x=object.x;
             st->s[st->len].y=object.y;
     }
     else 
         cout<<"栈满";
     st->len++;
}


elemtype pop(stack* st)
{
    elemtype qq;
   if(st->len>0)
       st->len--;
   else 
       cout<<"空栈";
  qq.x= st->s[st->len].x;
  qq.y=  st->s[st->len].y;
 return qq;
}   


void printstack(stack* st)
{
   int i=0;
   while(i<st->len)
   {
       cout<<st->s[i].x<<" "<<st->s[i].y<<" "<<endl;
            i++;
   }
}

我来回复

您尚未登录,请登录后再回复。点此登录或注册