马走日遍历

/* 13-07-10 10:53
   例题一:
马的遍历
中国象棋半张棋盘如图1所示。马自左下角往右上角跳。今规定只许往右跳,
不许往左跳,如图2所示。图1中表示一种跳行路线,将可能的所经路线都打印出来。打印格式为:
0,0->2,1->3,3->1,4->3,5->2,7->4,8

  分析:如何保存每走一步的数据:行列 是关键 用一个结构数组保存就很爽了
*/
#include<iostream>
using namespace std;
#define ROW 4        //4行
#define COL 8        //8列

struct STEP       //结构体保存每走一步的数据 :行 ,列 ,方向
{
       int row;
       int col;
       int dir;
} ;

int main()
{
    int ncurstep = 1;        //当前步为走的第几步 初始化为第一步 起点
    int ncurrow  = 0;        //当前的行和列都从起点开始
    int ncurcol  = 0;      
    int mydir[4][2] = {{2,1},{1,2},{-1,2},{-2,1}};  //定义一个点的4个不同方向
   
    //保存第一步(起点)的初始化数据
     STEP mystep[COL+2];      //步骤总数大小初始化为可容纳10步
     mystep[ncurstep].row = 0;
     mystep[ncurstep].col = 0;
     mystep[ncurstep].dir = 0;
     int ncount = 0; //一共有ncount种走法,现在已经找出0种。
    
     while (ncurstep>0)     //作死的循环判断
     {
           //马尝试往下一步走,保存下一步的的坐标
           int r = mystep[ncurstep].row + mydir[mystep[ncurstep].dir][0];
           int c = mystep[ncurstep].col + mydir[mystep[ncurstep].dir][1];
          
           if (r>=0 && r<=ROW && c>=0 && c<=COL)  //如果马没有走出固定的棋盘格子
           {
               //当前步数加1,并用结构体变量保存当前步骤所在的行列
                ncurstep++;
                mystep[ncurstep].row = r;      //保存行
                mystep[ncurstep].col = c;
                mystep[ncurstep].dir = 0;
               
                //每走一步判断是否到达目标点了
                if (r==ROW && c==COL)   //如果达到了目标点了 输出路径坐标
                {
                    ncount++;
                    cout<<ncount<<":";
                     cout<<"("<<mystep[1].row<<","<<mystep[1].col<<") ";
                    
                     for (int i=2; i<=ncurstep; i++)
                     {
                         cout<<"->("<<mystep[i].row<<","<<mystep[i].col<<") ";
                     }
                     cout<<endl;
                }     
           }
            else     //如果马走出了固定的棋盘,有这种可能,就重新换个方向去走当前dir加1
            {    //如果四种方向都试过了还没到终点,则退回上一步在循环
                       //到上一步后,在四个方向重新选一个方向进行去走
                while (mystep[ncurstep].dir>=3)
                {
                    ncurstep--;   //退回上一个点
                }
                mystep[ncurstep].dir++;    //换个没有走过的方向进行
            }   
     }
    
     cout<<"总共有"<<ncount<<"种走法"<<endl;
    
    system("pause");
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值