骑士游历(二) 问题描述:设有一个n×n的棋盘(n≤10),在棋盘上的任意一点A(x,y)有一中国象棋<马>,<马>走的规则同前,但取消<马>只能向右走的条件。试找出一条路径,使<马>不重复地走遍棋盘上的每一个点。其中左下角的坐标为(1,1)右上解的从标为(n,n)。 输入: 6 3 4 输出:(输出其中任意一种并输出到文件) 36 13 10 23 4 15 11 22 5 14 9 24 20 35 12 1 16 3 29 32 21 6 25 8 34 19 30 27 2 17 31 28 33 18 7 26 解题方法:用深搜模拟跳马,用a数组来存储方案,当马已经跳了n*n步时,输出当前方案 #include<iostream> #include<cstdio> using namespace std; int n,p,n1,n2,a[12][12]; const int dx[8]={2,1,-1,-2,-2,-1,1,2};//马可以走的方向(行) const int dy[8]={1,2,2,1,-1,-2,-2,-1};//马可以走的方向(列) void js(int x,int y,int z) {if (z>n*n)//判断是否填满{p=1;//记录for (int i=1;i<=n;i++)//循环行{for (int j=1;j<=n;j++)//循环列printf("%d ",a[i][j]);//输出printf("\n");//换行}return;}if (p==1) return;//如果输出过了,就退出for (int i=0;i<8;i++)if (x+dx[i]>0&&x+dx[i]<=n&&y+dy[i]>0&&y+dy[i]<=n)//判断是否出界if (a[x+dx[i]][y+dy[i]]==0)//是否跳过{a[x+dx[i]][y+dy[i]]=z;//记录js(x+dx[i],y+dy[i],z+1);//望一个方向跳a[x+dx[i]][y+dy[i]]=0;//回溯} }int main() {scanf("%d",&n);scanf("%d %d",&n1,&n2);memset(a,0,sizeof(a));p=0;a[n1][n2]=1;js(n1,n2,2); }