• 日进一步之“A Knight's Journey”


    题目大意:

      一个骑士,类似中国象棋的马,在一个矩形的棋盘上跳。

      询问是否存在一个起点,能让这个骑士不重复的跳完全部棋盘格子。

      输出骑士的行动路线,要求路径为最小字典序。

      无法达到目标则输出  impossible

      要注意每次输出换行后再换一行。

      输入 p q ,保证 1 <= p*q <= 26 。

      样例:

        3

        1 1

        2 3

        4 3

        ——————————————

        Scenario #1:

        A1

        Scenario #2:

        impossible

        Scenario #3:

        A1B3C1A2B4C2A3B1C3A4B2C4

    解题思路:

      最小字典序的要求用一个存放方向的数组体现。

      本次搜索不要走本次走过的点。

      每次行动更新标记数组,如果走到了一个之前搜索过的地方,就pass了。

      利用类或者结构体存放点坐标。

      用java的话一定要“实例化变量”。

      最开始出现了一个bug:

        在搜索中存放的坐标到了输出的时候,全都变成了最后一个坐标。

        比如输入 “4 3”  就连续输出了 12 个 C4。。。。

        改了半天,最后索性全部擦掉,改了一下类成员变量和输出方式,然后过了。

    AC代码:

     1 import java.util.*;
     2 
     3 class Pass{
     4     int xx;
     5     int yy;
     6     String temp = "";
     7     void set(int t1,int t2){ 
     8         xx = t1; yy = t2; 
     9         temp = "" + (char)(xx + 'A') + (yy + 1);
    10     }
    11     String get(){return temp;}
    12     
    13 }
    14 
    15 public class Main{
    16     
    17     static boolean mark[][] = new boolean[30][30];
    18     static int m; static int n;
    19     static Pass p[] = new Pass[30];
    20 
    21     static boolean dfs(int x,int y,int step){
    22         //p[step] = new Pass();
    23         int dir[][]={{-2,-1},{-2,1},{-1,-2},{-1,2},{1,-2},{1,2},{2,-1},{2,1}};
    24         if(step == m * n){
    25             mark[x][y] = true;
    26             p[step].set(x,y);
    27             return true;
    28         }
    29         mark[x][y] = true;
    30         p[step].set(x,y);
    31 
    32         int tx;int ty;
    33         for(int i = 0;i < 8;i ++){
    34             tx = x + dir[i][0];
    35             ty = y + dir[i][1];
    36             if(tx >= 0 && ty >= 0 && tx < n && ty < m && mark[tx][ty] == false){
    37                 if(dfs(tx,ty,step + 1) == true){ return true; }
    38                 mark[tx][ty] = false;
    39             }
    40         }
    41         return false;
    42     }
    43     
    44     public static void main(String[] args){
    45         Scanner sc = new Scanner(System.in);
    46         for(int i = 0;i < 30;i ++){p[i] = new Pass();}
    47         int T = sc.nextInt();int k = 1;
    48         while(T > 0){
    49             for(int i = 0;i < 30;i ++){for(int j = 0;j < 30;j ++){ mark[i][j] = false; }}
    50             boolean flag = false;
    51             m = sc.nextInt();
    52             n = sc.nextInt();
    53             System.out.printf("Scenario #%d:
    ",k++);
    54             for(int i = 0;i < n;i ++){
    55                 if(flag == true){break;}
    56                 for(int j = 0;j < m;j ++){
    57                     if(dfs(i,j,1) == true){
    58                         flag = true;
    59                         break;
    60                     }
    61                 }
    62             }
    63             if(flag == true){
    64                 String out = "";
    65                 for(int h = 1;h <= n * m;h ++){
    66                     out = out + p[h].get();
    67                 }
    68                 System.out.println(out);System.out.println();
    69             }
    70             if(flag == false){System.out.println("impossible");System.out.println();}
    71             T --;
    72         }
    73     }
    74 }

    PS:

      之所以用 “日进一步” 这个标题,不止是因为骑士的每一步都是走日字的,还包含了我希望我们的小队的每个成员都能日进一步的愿望,达到我们的梦想!!!!!!

      借博客园众多大佬的力量,在此许一次愿。。。。。。

  • 相关阅读:
    ES6中的export,import ,export default
    centos7 安装php 多线程pthreads
    ubuntu系统安装nginx出现的错误(依赖环境没有安装完)
    ubuntu彻底干净卸载MySQL、Apache2、Php的方法(各版本通用
    mysql-ubuntu14.04彻底卸载mysql
    centos 中GTK的安装
    centos 安装cmake 3.3.2
    yum安装方式的php,切换NTS为ZTS版本
    eclipse中jad反编译工具的安装
    在SpringMVC中获取request对象的几种方式
  • 原文地址:https://www.cnblogs.com/love-fromAtoZ/p/7552085.html
Copyright © 2020-2023  润新知