首页 > 其他分享 >【POJ 2488】A Knight‘s Journey 题解(深度优先搜索)

【POJ 2488】A Knight‘s Journey 题解(深度优先搜索)

时间:2023-09-18 13:32:45浏览次数:31  
标签:30 2488 int 题解 路径 Knight go 骑士 棋盘

背景 骑士厌倦了一次又一次地看到同样的黑白方块,决定去旅行 全世界每当骑士移动时,它是一个方向上的两个正方形和一个垂直于这个方向的正方形。骑士的世界就是他生活的棋盘。我们的骑士生活在一个棋盘上,这个棋盘的面积比普通的8*8棋盘小,但它仍然是矩形的。你能帮助这位冒险的骑士制定旅行计划吗? 问题 找到一条道路,让骑士访问每个广场一次。骑士可以在棋盘的任何一方开始和结束。

【POJ 2488】A Knight‘s Journey 题解(深度优先搜索)_测试用例

输入 输入以第一行中的正整数n开始。以下行包含n个测试用例。每个测试用例都由一条包含两个正整数p和q的单行线组成,因此1<=pq<=26。这表示一个pq棋盘,其中p表示有多少个不同的正方形数字1,p存在,q描述存在多少不同的方形字母。这是拉丁字母表的前q个字母:A。 输出 每个场景的输出都以包含“scenario#i:”的行开始,其中i是从1开始的场景编号。然后打印一条单行线,其中包含按字典顺序排列的第一条路径,该路径访问棋盘上的所有方格,骑士移动后接一条空行。路径应通过连接访问的方块的名称在单行上给出。每个方块名称由一个大写字母和一个数字组成。 如果不存在这样的路径,则应该在单行上输出“impossible”。

Sample Input 3 1 1 2 3 4 3

Output Scenario #1: A1

Scenario #2: impossible

Scenario #3: A1B3C1A2B4C2A3B1C3A4B2C4

思路

从(1,1)开始进行搜索,同时记录步数,若步数等于棋盘格数,则找到路径。需要注意的是,输入数据的顺序是行列,输出的是列行,且列序号要转为大写字母输出。

AC代码

#include <iostream>
#include <cstring>
using namespace std;
#define AUTHOR "HEX9CF"

const int go[8][2] = {
    -2, -1,
    -2, 1,
    -1, -2,
    -1, 2,
    1, -2,
    1, 2,
    2, -1,
    2, 1};

int n, m;
int vis[30][30];
int path[30][2];
int flg;

void dfs(int x, int y, int s){
    if(s == m * n){
        flg = 1;
        return;
    }
    for(int i = 0; i < 8; i++) {
        int xx = x + go[i][0];
        int yy = y + go[i][1];
        if(xx > 0 && xx <= n && yy > 0 && yy <= m && !vis[xx][yy] && !flg){
            vis[xx][yy] = 1;
            path[s][0] = xx;
            path[s][1] = yy;
            dfs(xx, yy, s + 1);
            vis[xx][yy] = 0;
        }
    }
    return;
}

int main() {
    int t;
    cin >> t;
    for(int cnt = 1; t--; cnt++){
        cin >> m >> n;// 行 列
        cout << "Scenario #" << cnt << ":" << endl;
        flg = 0;
        memset(vis, 0, sizeof(vis));
        path[0][0] = 1;
        path[0][1] = 1;
        vis[1][1] = 1;
        dfs(1, 1, 1);
        if(flg){
            for(int i = 0; i < n * m; i++){
                cout << char(path[i][0] + 'A' - 1) << path[i][1];
            }
            cout << endl;
        }
        else
        {
            cout << "impossible" << endl;
        }
        cout << endl;
    }
    return 0;
}

标签:30,2488,int,题解,路径,Knight,go,骑士,棋盘
From: https://blog.51cto.com/HEX9CF/7509396

相关文章

  • [题解]Pa?sWorD(2023ICPC网络预选赛第一场I题)
    IPa?sWorD下次不要认为2e8可以莽过去了思路计数DP+状压(其实也可以不压)+前缀和优化(倒着写是差分)dp[i][j][k]表示第i位填j,状态为k的方案数k这一维用于状态压缩,表示数字、大写、小写是否出现前缀和优化:在处理?的时候,暴力会有62X62X8的单次复杂度,但不难发现,关于......
  • Death DBMS题解(AC自动机)
    题目传送门CF1437G好题观察这道题,发现有关字串的题目,一般来说,这种题都要构建\(AC\)自动机,所以考虑构建。构建之后,原来的所有\(fail\)是一个树形结构。解法\(1\):考虑从询问入手,那么对于每一个询问,等价于就是查询每一个\(Q_i\)包含的后缀的最大值,再对这些最大值取\(max......
  • 题解 LOJ2549【[JSOI2018] 战争】
    problem给你两个平面凸多边形\(A,B\),\(Q\)次询问,每次询问是一个向量\(\vecv\),回答\(A\)与\(B+\vecv\)是否有交。\(n,Q\leq10^5\)。solution观察闵可夫斯基和(Minkowskysum)的定义,若将这个运算定义为\((*)::[Point]\to[Point]\to[Point]\),则满足:\[A*B=\{......
  • 【UVA 572】Oil Deposits 题解(深度优先搜索)
    GeoSurvComp地质调查公司负责探测地下石油矿床。GeoSurvComp一次处理一个大的矩形土地区域,并创建一个划分将土地分割成许多方形地块。然后使用传感设备分别分析每个地块确定图中是否含有油。含有石油的地块称为口袋。如果两个口袋相邻,则它们是相同的油沉积。油沉积物可能非常......
  • CF70D Professor's task 题解 & 动态凸包板子
    CF70DProfessor'stask题解前言此篇题解用的是\(Andrew\),不想看这种做法的可以绕道。题意动态凸包板子题。维护动态凸包。两种操作,加一个点或查询一个点是否在凸包内。题解首先你得会静态二维凸包。维护二维凸包的方法挺多的,比如什么\(Andrew\)算法,\(Jarvis\)算法还......
  • 简单分治快排问题解析(c++实现)
    这几天刷了需要使用分治快排思想去解决的几道比较好的题目,所以写下这篇博客用于复习和以后的复盘。什么是分治快排思想首先我们要知道什么是分治快排思想,这个思想其实就是在模拟实现qsort算法的时候使用的一个方法,在模拟实现qsort的时候,我们知道第一步是需要使用一个随意选择(三数取......
  • [ABC320E] Somen Nagashi题解
    2023-09-16题目题目传送门翻译翻译难度&重要性(1~10):4题目来源AtCoder题目算法优先队列解题思路水题一道。需要两个优先队列:因为每一次是队首的人拿到面条,即队列中编号最小的拿面条,就用一个优先队列用来维护当前队列中的编号最小的人。由于每一次拿了面条后再......
  • [ABC320F] Fuel Round Trip 题解
    题意在坐标轴上给定\(N\)个点,坐标依次为\(X_1,X_2,\cdots,X_N\),你需要从原点前往\(X_N\)并折返,其中在第\(1\)个到第\(N-1\)个点上有加油站,其中第\(i\)个加油站可以花费\(P_i\)购买\(F_i\)升汽油,汽油持有上限为\(H\)升,每行驶一单位距离需要花费一升汽油。在......
  • 【题解】AtCoder-ABC320
    AtCoder-ABC320ALeylandNumber依题意计算。提交记录:Submission-AtCoderAtCoder-ABC320BLongestPalindrome直接\(O(n^2)\)枚举,\(O(n)\)判断。提交记录:Submission-AtCoderAtCoder-ABC320CSlotStrategy2(Easy)不妨将字符串复制三遍,枚举\([0,3m)\)判断。提交......
  • 【POJ 3275】Ranking the Cows 题解(传递闭包)
    农夫约翰的N头奶牛(1≤N≤1000)产奶率各不相同,FJ希望根据这些比率从最快的奶牛到最慢的奶牛订购奶牛。FJ已经比较了M(1≤M≤10000)对奶牛的产奶率。他想列出另外C对奶牛的列表,这样,如果他现在比较这些C对奶牛,他肯定能够推断出所有N头牛的正确顺序。请帮助他确定C的最小值,这样的列表是可......