Topcoder_16

【问题描述】
    你们全家正在一条路上开车旅行。你的父亲给你一张地图,途上标注了什么地方车子需要转弯。比如,
String[] map = {".........R....",
                        "..............",
                        "...L.....R....",
                        "..............",
                        "...L.....B...."}
    '.'代表直行,'R'代表右转,'L'代表左转,'B'代表回转。在你们离开地图或者在图中无限循环之前,需要一直遵循该图的指引。假设你们开始是在图的左上角的顶点向右侧行驶,按照上面的地图你们的路程将会是:
 >>>>>>>>>v....                                 
 ..............
 .........v....                                 
 ..............
 ...v<<<<<<....   
 ..............
 ...v..........      
 ..............
 ...>>>>>><....                                 
 ...v<<<<<<....
     转动的方向是和你们正在前进的方向相关的。你的家人想要尽可能多的拍摄沿途的风景照片,换句话说,就是想要游览地图上尽可能多的地方。在上例中,你们的车经过了地图中的这些点:
 xxxxxxxxxx....                 
 .........x....
 ...xxxxxxx....
 ...x..........
 ...xxxxxxx....
     'X'的总数量是26。现在你的任务是找到最佳的出发点和初始方向,使得可以经过图中尽可能多的位置(重复算一次),返回所经过的位置的数量。在上例中,旅行的路线是能达到最多位置的方式之一,因此你的方法返回26。如果在你进入地图的点上有转向标志那么该标志立刻生效。例如,map = {"R...B"},如果你们最开始在左上角点方向向右,那么你们的路线将是v....,如果你们开始于最右面的点并且方向是向右,那么你们的路线是^<<<<,因此你的方法应该返回5。注意,可能会出现无限循环的情况(永远出不了地图),但是无论如何总是需要返回你们能经过位置的个数。

   定义:
 类  RoadTrip
 方法  public int howMany(String[] map)

   约束:
 1、你选择的开始点一定在该图上,并且方向是上下左右之一
 2、地图一定包括1至30个元素
 3、每个元素的长度是1至30
 4、地图的每个元素包含相同的长度
 5、地图中仅包含"BRL."该四种字符

   测试用例:
 1、
 {".........R....",
 "..............",
 "...L.....R....",
 "..............",
 "...L.....B...."}
Returns: 26
 2、
 {".........R.....R.......",
 ".......................",
 ".........B.............",
 ".......................",
 ".......................",
 "..B......R.....R......B",
 ".......................",
 ".......................",
 ".......................",
 ".........B.....B......."}
Returns: 60
3、
{"......................R",
 "R....................R.",
 ".R..................R..",
 "..R................R...",
 "...R..............R....",
 "....R.............R....",
 "...R...............R...",
 "..R.................R..",
 ".R...................R.",
 "R.....................R"}
Returns: 230
4、
{".B.....B"}
Returns: 7
  1. public class RoadTrip {
  2.     private char[][] maps;
  3.     public int howMany(String[] map) {
  4.         int max = 0, tmp = 0;
  5.         maps = new char[map.length][map[0].length()];
  6.         for (int i = 0; i < maps.length; i++)
  7.             for (int k = 0; k < maps[0].length; k++)
  8.                 maps[i][k] = map[i].charAt(k);
  9.         for (int i = 0; i < maps.length; i++)
  10.             for (int k = 0; k < maps[0].length; k++)
  11.                 for (int d = 0; d < 4; d++) {
  12.                     tmp = getSpotCount(i, k, d);
  13.                     max = tmp > max ? tmp : max;
  14.                 }
  15.         return max;
  16.     }
  17.     // 0--right 1--down 2--left 3--up
  18.     private int getSpotCount(int x, int y, int direct) {
  19.         int[][] past = new int[maps.length][maps[0].length];
  20.         int sum = 0, count = 0
  21.         while (x >= 0 && x < maps.length && y >= 0 && y < maps[0].length) {
  22.             if (past[x][y] == 0) {
  23.                 sum++;
  24.                 past[x][y] = 1;
  25.             }
  26.             count++;
  27.             
  28.             if (maps[x][y] != '.')
  29.                 direct = getDirect(direct, maps[x][y]);
  30.             if (direct == 0)
  31.                 y++;
  32.             else if (direct == 1)
  33.                 x++;
  34.             else if (direct == 2)
  35.                 y--;
  36.             else if (direct == 3)
  37.                 x--;
  38.             
  39.             if (count == 2 * sum)
  40.                 break;
  41.         }
  42.         return sum;
  43.     }
  44.     private int getDirect(int srcDirect, char turn) {
  45.         if (turn == 'R')
  46.             return srcDirect + 1 > 3 ? srcDirect + 1 - 4 : srcDirect + 1;
  47.         if (turn == 'L')
  48.             return srcDirect + 3 > 3 ? srcDirect + 3 - 4 : srcDirect + 3;
  49.         if (turn == 'B')
  50.             return srcDirect + 2 > 3 ? srcDirect + 2 - 4 : srcDirect + 2;
  51.         return -1;
  52.     }
  53. }
【算法思想】
    遍历使用该图中每一个点(作为起始点)和每一个方向,计算所遍经位置的数量,最后取最大值。
    注:判断路径陷入死循环的方法,记录2个计数器,一个是不重复的位置计数sum,一个是所经历的位置计数count,如果如果count=2*sum那么就是循环。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值