/* 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;
}