• 路径之谜


    小明冒充X星球的骑士,进入了一个奇怪的城堡。
    城堡里边什么都没有,只有方形石头铺成的地面。

    假设城堡地面是 n x n 个方格。【如图1.png】所示。

    按习俗,骑士要从西北角走到东南角。
    可以横向或纵向移动,但不能斜着走,也不能跳跃。
    每走到一个新方格,就要向正北方和正西方各射一箭。
    (城堡的西墙和北墙内各有 n 个靶子)


    同一个方格只允许经过一次。但不必做完所有的方格。

    如果只给出靶子上箭的数目,你能推断出骑士的行走路线吗?

    有时是可以的,比如图1.png中的例子。

    本题的要求就是已知箭靶数字,求骑士的行走路径(测试数据保证路径唯一)

    输入:
    第一行一个整数N(0<N<20),表示地面有 N x N 个方格
    第二行N个整数,空格分开,表示北边的箭靶上的数字(自西向东)
    第三行N个整数,空格分开,表示西边的箭靶上的数字(自北向南)

    输出:
    一行若干个整数,表示骑士路径。

    为了方便表示,我们约定每个小格子用一个数字代表,从西北角开始编号: 0,1,2,3....
    比如,图1.png中的方块编号为:

    0 1 2 3
    4 5 6 7
    8 9 10 11
    12 13 14 15


    示例:
    用户输入:
    4
    2 4 3 4
    4 3 3 3

    程序应该输出:
    0 4 5 1 2 3 7 11 10 9 13 14 15

    资源约定:
    峰值内存消耗 < 256M
    CPU消耗 < 1000ms


    请严格按要求输出,不要画蛇添足地打印类似:“请您输入...” 的多余内容。

    所有代码放在同一个源文件中,调试通过后,拷贝提交该源码。
    注意:不要使用package语句。不要使用jdk1.7及以上版本的特性。
    注意:主类的名字必须是:Main,否则按无效代码处理。

    dfs题

    a:自西向东靶子上箭的数目。

    b:自南向北靶子上箭的数目。

    c:记录有没有走过第i,j个格子。

    d:记录走过的路线。

    a1:当前自西向东靶子上箭的数目。

    b1:当前自南向北靶子上箭的数目。

      1 import java.util.Arrays;
      2 import java.util.Scanner;
      3 
      4 
      5 public class Main {
      6     static int[] a;
      7     static int[] b;
      8     static boolean[][] c;
      9     static int[] d;
     10     static int n;
     11     public static void main(String[] args) {
     12         Scanner input = new Scanner(System.in);
     13         n = input.nextInt();
     14         a = new int[n+1];
     15         b = new int[n+1];
     16         c = new boolean [n+2][n+2];
     17         d = new int[n*n+1];
     18         c[1][1] = true;
     19         for(int i=0;i<=n;i++){
     20             c[0][i] = true;
     21         }
     22         for(int i=0;i<=n;i++){
     23             c[n+1][i] = true;
     24         }
     25         for(int i=0;i<=n;i++){
     26             c[i][0] = true;
     27         }
     28         for(int i=0;i<=n;i++){
     29             c[i][n+1] = true;
     30         }
     31         for(int i=1;i<=n;i++){
     32             a[i] = input.nextInt();
     33         }
     34         for(int i=1;i<=n;i++){
     35             b[i] = input.nextInt();
     36         }
     37         a[1]--;
     38         b[1]--;
     39         f(a,b,1,1,1);
     40         
     41     }
     42     public static void f(int[] a1,int[] b1,int i,int j,int h){
     43         if(f1(a1,b1)){
     44             return;
     45         }
     46         if(f2(a1,b1)&&i==n&&j==n){
     47             d[h] = n*n-1;
     48             for(int k=1;k<=h;k++){
     49                 System.out.print(d[k]+" ");
     50             }
     51             System.exit(0);
     52         }
     53         if(i==n&&j==n){
     54             return;
     55         }
     56         d[h] = (i-1)*n+j-1;
     57         if(!c[i-1][j]){
     58             c[i-1][j] = true;
     59             a1[j]--;
     60             b1[i-1]--;
     61             f(a1,b1,i-1,j,h+1);
     62             c[i-1][j] = false;
     63             a1[j]++;
     64             b1[i-1]++;
     65         }
     66         if(!c[i+1][j]){
     67             c[i+1][j] = true;
     68             a1[j]--;
     69             b1[i+1]--;
     70             f(a1,b1,i+1,j,h+1);
     71             c[i+1][j] = false;
     72             a1[j]++;
     73             b1[i+1]++;
     74         }
     75         if(!c[i][j-1]){
     76             c[i][j-1] = true;
     77             a1[j-1]--;
     78             b1[i]--;
     79             f(a1,b1,i,j-1,h+1);
     80             c[i][j-1] = false;
     81             a1[j-1]++;
     82             b1[i]++;
     83         }
     84         if(!c[i][j+1]){
     85             c[i][j+1] = true;
     86             a1[j+1]--;
     87             b1[i]--;
     88             f(a1,b1,i,j+1,h+1);
     89             c[i][j+1] = false;
     90             a1[j+1]++;
     91             b1[i]++;
     92         }
     93     }
     94     public static boolean f1(int[] a1,int[] b1){
     95         for(int i=1;i<=n;i++){
     96             if(a1[i]<0||b1[i]<0){
     97                 return true;
     98             }
     99         }
    100         return false;
    101     }
    102     public static boolean f2(int[] a1,int[]b1){
    103         for(int i=1;i<=n;i++){
    104             if(a1[i]!=0||b1[i]!=0){
    105                 return false;
    106             }
    107         }
    108         return true;
    109     }
    110     
    111     
    112 }
  • 相关阅读:
    [LeetCode] Majority Element II
    [Nginx] 事件模型
    [Nginx] 进程模型
    [C++] 函数中的字符串指针与数组
    [LeetCode] Shortest Distance to a Character
    [LeetCode] Number of Lines To Write String
    Ubuntu 16.04中安装谷歌Chrome浏览器
    Python、机器学习、计算机视觉、深度学习入门
    Sublime安装与配置
    [20160807][系统设计的三次迭代]
  • 原文地址:https://www.cnblogs.com/lolybj/p/6884210.html
Copyright © 2020-2023  润新知