很多私信都问过这个问题 今天清理idea里的代码
分享一下 然后清理了
问题描述:
一个字符型二维矩阵中,每个格子都代表一个地理位置信息,需要设计一个无人机的飞行路线,拍下地图全景,每次可以拍上下左右中五个位置的照片。
主要思路:
1 螺旋飞行+3格定时拍照,每三个格子拍照一次,可以保证拍下全图。足够大的情况下,拍照次数约为全图1/3
2 隔行跳跃飞行,可以保证拍下全图。足够大的情况下,飞行距离约为全图1/3
代码很简单,思路也很简单,这一面一般不会挂人,最后挂在了非技术上也是挺离谱
import java.util.Scanner; public class Plane { public static void main(String[] args) { Scanner input = new Scanner(System.in); int row = input.nextInt(); int col = input.nextInt(); // 创建地图 int[][] map = createMap(row, col); // 螺旋飞行 //new SolutionOne().spiralTravel(map, 0, map[0].length - 1, 0, map.length - 1); // 跳跃飞行 new SolutionTwo().skipTravel(map, 0, map[0].length - 1, 1, map.length - 1); // 打印结果 printMap(map); } private static int[][] createMap(int row, int col) { return new int[row][col]; } private static void printMap(int[][] map) { for (int[] info : map) { for (int val : info) { System.out.print(val + " "); } System.out.println(); } } }
public class SolutionOne { public void spiralTravel(int[][] map, int left, int right, int up, int down) { int count = 0; while (true) { // 左到右 for (int col = left; col <= right; col++) { takePhoto(map, up, col, count++); } if (++up > down) break; // 上到下 for (int row = up; row <= down; row++) { takePhoto(map, row, right, count++); } if (--right < left) break; // 右到左 for (int col = right; col >= left; col--) { takePhoto(map, down, col, count++); } if (--down < up) break; // 下到上 for (int row = down; row >= up; row--) { takePhoto(map, row, left, count++); } if (++left > right) break; } } private void takePhoto(int[][] map, int row, int col, int count) { if (count % 3 == 0) { map[row][col] = 1; } } }
public class SolutionTwo { public void skipTravel(int[][] map, int left, int right, int up, int down) { boolean leftToRight = true; while (true) { if (leftToRight) { moveL2R(map, left, right, up); leftToRight = false; } else { moveR2L(map, left, right, up); leftToRight = true; } // 边界判断 if (up + 1 == down) { break; } // 跳跃条件 if (up + 3 < down) { up = leftToRight ? skip(map, up, left, 3) : skip(map, up, right, 3); } else if (up + 3 == down) { up = leftToRight ? skip(map, up, left, 2) : skip(map, up, right, 2); } else { up = leftToRight ? skip(map, up, left, 1) : skip(map, up, right, 1); } } } private int skip(int[][] map, int up, int direction, int count) { for (int i = 0; i < count; i++) { map[up++][direction] = 1; } return up; } private void moveL2R(int[][] map, int left, int right, int up) { for (int col = left; col <= right; col++) { map[up][col] = 1; } } private void moveR2L(int[][] map, int left, int right, int up) { for (int col = right; col >= left; col--) { map[up][col] = 1; } } }
全部评论
(17) 回帖