【SSL】骑士游历2

博客探讨了一个扩展的骑士游历问题,允许<马>在n×n的棋盘上不重复地走过每个点。题目描述了输入输出格式,并提供了解题思路,强调只需拓展方向并使用二维数组记录路径。博主分享了通过修改骑士游历1的解法来解决这个问题,并感叹Ctrl+c和Ctrl+v的便利。
摘要由CSDN通过智能技术生成

此为本蒟蒻的第二篇博客,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就好了

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值