此为本蒟蒻的第二篇博客,dalao勿喷,谢谢包容
骑士游历2
题目
设有一个n×n的棋盘(n≤10),在棋盘上的任意一点A(x,y)有一中国象棋<马>,<马>走的规则同前,但取消<马>只能向右走的条件。试找出一条路径,使<马>不重复地走遍棋盘上的每一个点。其中左下角的坐标为(1,1)右上解的从标为(n,n)。
输入
输入n,x和y,分别表示棋盘的大小和起点的坐标。
输出
输出任意一种方式(具体请看样例)
样例输入
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
解题思路
一道不知道怎么形容的题,,只需要拓展一下方向并且用一个二维数组记录每一次落下的点,其他的和骑士游历1差不多(感觉像在给自己打广告 ),因为题目只要求输出一种方式,所以输出后就可以退出了。话不多说
程序如下
#include<iostream>
#include<cstdio>
#include<string>
#include<cstring>
#include<algorithm>
#include<iomanip>
const int maxn=20;
const int dx[9]={0,2,1,-1,-2,-2,-1,1,2};//定义方向
const int dy[9]={0,1,2,2,1,-1,-2,-2,-1};
int a[maxn+2][maxn+2],c[maxn+2][maxn+2],n,m,k;
bool p;
using namespace std;
void dfs(int dep,int x,int y)
{
if(dep==k*k)
{
for(int i=1;i<=k;i++)
{
for(int j=1;j<=k;j++)
cout<<c[i][j]<<" ";
cout<<endl;
}
p=1;//用于退出程序
return;
}
for(int i=1;i<=8;i++)
{
if(x+dx[i]>0&&x+dx[i]<=k&&y+dy[i]>0&&y+dy[i]<=k)
if(a[x+dx[i]][y+dy[i]]==0)
{
c[x+dx[i]][y+dy[i]]=dep+1;
a[x+dx[i]][y+dy[i]]=1;
dfs(dep+1,x+dx[i],y+dy[i]);
a[x+dx[i]][y+dy[i]]=0;
if (p) return;
}
}
}
int main()
{
cin>>k;
cin>>n>>m;
a[n][m]=1;
c[n][m]=1;
dfs(1,n,m);
}
累死了,我想了好久。
Ctrl+c和Ctrl+v真好用,其实改一改骑士游历1就好了