zoukankan      html  css  js  c++  java
  • 广大暑假训练1(poj 2488) A Knight's Journey 解题报告

    题目链接:http://vjudge.net/contest/view.action?cid=51369#problem/A   (A - Children of the Candy Corn)

                   http://poj.org/problem?id=2488   (A Knight's Journey)

       (不知道为什么,名字竟然不同哇~~~~还是poj 改名改得好)

    题目意思:给出一个p * q 的棋盘,行用阿拉伯数字1,2,...,p-1, p 来表示,列从大写字母'A'开始表示。我这里为了简化问题,对于以下5 * 5 这个棋盘,可以把(1, B) 这个点看成是坐标(1, 2),其他依此类推。不硬性规定要从哪个点开始,从哪个点结束,不过要把整个棋盘的每个点都要走过,按“日”字来走(玩过中国象棋的人一定很熟悉,就是马走“日”),如果不能把每个点都走过,就输出impossible,否则输出一条字典序最少的路径。

        

          这个字典序最少真的是害人不少啊~~~而且,DFS 保存路径,我还是第一次接触,可能方法比较笨。为了按字典序最少来输出,很明显对于(3, 3)这个点来说,最先试探的应该是(2, 1) 这个点,其次是(4, 1), 接着是(1, 2), (5, 2),(1, 4), (5, 4), (2, 5), (4, 5)。

         红色字体的那部分表示相对于(3, 3) 这个中点来看,能走的8个点相对这个中点来说相差多少,假设要去(4, 1)这个点,(3,3) + (1, -2) ——> (4,1),所以设的8个方向可以到达的点不能乱来,是有顺序的!!!!

         虽然写得比较长,不过是自己花了差不多4个小时做出来的(参考了自己以前写得一篇Knight Moves),也算是挺有成就感的^_^

        

     1 #include <iostream>
     2 #include <cstdio>
     3 #include <cstdlib>
     4 #include <cstring>
     5 using namespace std;
     6 
     7 const int maxn = 100 + 10;
     8 int dx[] = {-1, 1, -2, 2, -2, 2, -1, 1};   // 这个设置不要乱了,字典序输出最少的关键啊~~~
     9 int dy[] = {-2, -2, -1, -1, 1, 1, 2, 2};
    10 int grid[maxn][maxn], route[maxn];
    11 int p, q, flag, len;
    12 
    13 void dfs(int x, int y, int move, int len)
    14 {
    15     if (move == p*q)     // 找到一条路径就不再找了(flag = 1, 使得dfs到此结束)
    16     {
    17         flag = 1;
    18         for (int i = 0; i < len-2; i++)
    19         {
    20             if (route[i])
    21             {
    22                 if (i % 2 == 0)
    23                     printf("%c", route[i]+'A'-1);  // route[0], route[2],...,route[2*n] 保存字母
    24                 else
    25                     printf("%d", route[i]);      // route[1], route[3], ...,route[2*n-1] 保存数字
    26             }
    27         }
    28         printf("%c%d
    ", route[len-2]+'A'-1, route[len-1]);
    29     }
    30     for (int i = 0; i < 8 && !flag; i++)
    31     {
    32         int tx = x + dx[i];
    33         int ty = y + dy[i];
    34         if (tx > 0 && tx <= p && ty > 0 && ty <= q && !grid[tx][ty])   // 在棋盘里面且没有走过
    35         {
    36             grid[tx][ty] = 1;
    37             route[len] = ty;        // 不是tx!!看样例!! 所以保存路径时要稍稍注意啦^_^
    38             route[len+1] = tx;
    39             dfs(tx, ty, move+1, len+2);
    40             grid[tx][ty] = 0;
    41             route[len] = 0;
    42             route[len+1] = 0;
    43         }
    44     }
    45 }
    46 
    47 int main()
    48 {
    49     int t;
    50     while (scanf("%d", &t) != EOF)
    51     {
    52         int cas = 0;
    53         while (t--)
    54         {
    55             scanf("%d%d", &p, &q);
    56             printf("Scenario #%d:
    ", ++cas);
    57             flag = 0;
    58             for (int i = 1; i <= p && !flag; i++)
    59             {
    60                 for (int j = 1; j <= q && !flag; j++)
    61                 {
    62                     memset(grid, 0, sizeof(grid));
    63                     memset(route, 0, sizeof(route));
    64                     flag = 0;
    65                     len = 0;
    66                     route[len] = i;      // 假设可以从i, j,出发
    67                     route[len+1] = j;
    68                     grid[i][j] = 1;      // i, j设为已走
    69                     dfs(i, j, 1, 2);
    70                 }
    71             }
    72             if (!flag)
    73                 printf("impossible
    ");
    74             printf("
    ");
    75         }
    76     }
    77     return 0;
    78 }

        (今天暑假集训生活正式开始了,努力吧,+2)

  • 相关阅读:
    用 for/in 在 Java 5.0 中增强循环
    http://blog.sina.com.cn/s/articlelist_1973273451_0_1.html
    android PreferenceActivity
    高通芯片中的MDP模块[msm7x27]
    Android学习使用单例模式实现一键退出APP
    Android 开发之使用Eclipse Debug调试详解
    修改dll,效率提升50%—单键完成“复制”、“粘贴”
    MyEclipse 断言(assert)设置
    java enum 笔记 日期时间格式化
    common.logging相关网址
  • 原文地址:https://www.cnblogs.com/windysai/p/3873931.html
Copyright © 2011-2022 走看看