Advertisement
Guest User

Untitled

a guest
Jun 24th, 2017
58
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 5.06 KB | None | 0 0
  1. import java.awt.Point;
  2. import java.util.Scanner;
  3.  
  4. /**
  5.  * Copyright © 2010 McKesson Corporation and/or one of its subsidiaries.
  6.  * All rights reserved.
  7.  */
  8.  
  9. /**
  10.  * @author BoHao Li
  11.  */
  12. public class G
  13. {
  14.     public static String[] DIRECTIONS = { "east", "north", "south", "west" };
  15.  
  16.     public void process(Point[] vamps, Point[] mortals, String[] mirrorDir, Point[] mirrorStart, Point[] mirrorEnd, int biggestX, int biggestY)
  17.     {
  18.         System.err.println("biggestX/Y: " + biggestX + " " + biggestY);
  19.  
  20.         char[][] grid = new char[biggestX + 1][biggestY + 1];
  21.         boolean[][] exposed = new boolean[vamps.length][4]; // E N S W
  22.  
  23.         for (Point v : vamps)
  24.         {
  25.             grid[v.x][v.y] = 'V';
  26.         }
  27.  
  28.         for (Point m : mortals)
  29.         {
  30.             grid[m.x][m.y] = 'M';
  31.         }
  32.  
  33.         for (int i = 0; i < mirrorDir.length; i++)
  34.         {
  35.             // System.err.println("mirror: " + i);
  36.  
  37.             // vertical mirror
  38.             if (mirrorStart[i].x == mirrorEnd[i].x)
  39.             {
  40.                 int dir = mirrorStart[i].y < mirrorEnd[i].y ? 1 : -1;
  41.                 for (int j = mirrorStart[i].y; j != mirrorEnd[i].y + dir; j += dir)
  42.                 {
  43.                     grid[mirrorStart[i].x][j] = mirrorDir[i].charAt(0);
  44.                 }
  45.             }
  46.             // horiz mirror
  47.             else if (mirrorStart[i].y == mirrorEnd[i].y)
  48.             {
  49.                 int dir = mirrorStart[i].x < mirrorEnd[i].x ? 1 : -1;
  50.  
  51.                 for (int j = mirrorStart[i].x; j != mirrorEnd[i].x + dir; j += dir)
  52.                 {
  53.                     System.err.println("j: " + j);
  54.                     grid[j][mirrorStart[i].y] = mirrorDir[i].charAt(0);
  55.                 }
  56.             }
  57.             else
  58.             {
  59.                 System.err.println("mirror neither horizontal nor vertical?");
  60.             }
  61.         }
  62.  
  63.         // debug print grid
  64.         // for (char[] row : grid)
  65.         // {
  66.         // System.err.println(Arrays.toString(row));
  67.         // }
  68.  
  69.         // expand from V to find interesting grid squares
  70.         for (int i = 0; i < vamps.length; i++)
  71.         {
  72.  
  73.             // up
  74.             for (int y = vamps[i].y; y >= 0; y--)
  75.             {
  76.                 char v = grid[vamps[i].x][y];
  77.                 if (v == 'M' || v == 'N' || v == 'E' || v == 'W')
  78.                 {
  79.                     break;
  80.                 }
  81.                 if (v == 'W')
  82.                 {
  83.                     exposed[i][2] = true;
  84.                     break;
  85.                 }
  86.             }
  87.  
  88.             // down
  89.             for (int y = vamps[i].y; y <= biggestY; y++)
  90.             {
  91.                 char v = grid[vamps[i].x][y];
  92.                 if (v == 'M' || v == 'S' || v == 'E' || v == 'W')
  93.                 {
  94.                     break;
  95.                 }
  96.                 if (v == 'N')
  97.                 {
  98.                     exposed[i][1] = true;
  99.                     break;
  100.                 }
  101.             }
  102.  
  103.             // left
  104.             for (int x = vamps[i].x; x >= 0; x--)
  105.             {
  106.                 char v = grid[x][vamps[i].y];
  107.                 if (v == 'M' || v == 'N' || v == 'S' || v == 'W')
  108.                 {
  109.                     break;
  110.                 }
  111.                 if (v == 'E')
  112.                 {
  113.                     exposed[i][0] = true;
  114.                     break;
  115.                 }
  116.             }
  117.  
  118.             // right
  119.             for (int x = vamps[i].x; x <= biggestX; x++)
  120.             {
  121.                 char v = grid[x][vamps[i].y];
  122.                 if (v == 'M' || v == 'N' || v == 'S' || v == 'E')
  123.                 {
  124.                     break;
  125.                 }
  126.                 if (v == 'W')
  127.                 {
  128.                     System.out.println("x: " + x + " v: " + v);
  129.                     exposed[i][3] = true;
  130.                     break;
  131.                 }
  132.             }
  133.         }
  134.  
  135.         // see if printing necessary
  136.         boolean oneHit = false;
  137.         boolean[] vampHit = new boolean[vamps.length];
  138.         for (int i = 0; i < vamps.length; i++)
  139.         {
  140.             vampHit[i] = (exposed[i][0] || exposed[i][1] || exposed[i][2] || exposed[i][3]);
  141.             oneHit |= vampHit[i];
  142.         }
  143.  
  144.         // if not print none
  145.         if (!oneHit)
  146.         {
  147.             System.out.println("none");
  148.             return;
  149.         }
  150.  
  151.         // otherwise go through and tell about each vampire
  152.         for (int i = 0; i < vamps.length; i++)
  153.         {
  154.             if (vampHit[i])
  155.             {
  156.                 System.out.print("vampire " + i);
  157.                 for (int j = 0; j < 4; j++)
  158.                 {
  159.                     if (exposed[i][j])
  160.                     {
  161.                         System.out.print(DIRECTIONS[j]);
  162.                     }
  163.                 }
  164.                 System.out.println();
  165.             }
  166.         }
  167.  
  168.     }
  169.  
  170.     public void doIt()
  171.     {
  172.         Scanner scan = new Scanner(System.in);
  173.  
  174.         int v, o, m;
  175.         v = scan.nextInt();
  176.         o = scan.nextInt();
  177.         m = scan.nextInt();
  178.         int c = 0;
  179.         while (v != 0 && o != 0 && m != 0)
  180.         {
  181.             c++;
  182.             int biggestX = -1;
  183.             int biggestY = -1;
  184.  
  185.             Point[] vamps = new Point[v];
  186.             for (int i = 0; i < v; i++)
  187.             {
  188.                 vamps[i] = new Point(scan.nextInt(), scan.nextInt());
  189.                 biggestX = Math.max(biggestX, vamps[i].x);
  190.                 biggestY = Math.max(biggestY, vamps[i].y);
  191.             }
  192.  
  193.             Point[] mortals = new Point[o];
  194.             for (int i = 0; i < o; i++)
  195.             {
  196.                 mortals[i] = new Point(scan.nextInt(), scan.nextInt());
  197.                 biggestX = Math.max(biggestX, mortals[i].x);
  198.                 biggestY = Math.max(biggestY, mortals[i].y);
  199.             }
  200.  
  201.             String[] mirrorDir = new String[m];
  202.             Point[] mirrorStart = new Point[m];
  203.             Point[] mirrorEnd = new Point[m];
  204.             for (int i = 0; i < m; i++)
  205.             {
  206.                 mirrorDir[i] = scan.next();
  207.                 mirrorStart[i] = new Point(scan.nextInt(), scan.nextInt());
  208.                 mirrorEnd[i] = new Point(scan.nextInt(), scan.nextInt());
  209.  
  210.                 biggestX = Math.max(biggestX, mirrorStart[i].x);
  211.                 biggestY = Math.max(biggestY, mirrorStart[i].y);
  212.  
  213.                 biggestX = Math.max(biggestX, mirrorEnd[i].x);
  214.                 biggestY = Math.max(biggestY, mirrorEnd[i].y);
  215.             }
  216.  
  217.             System.out.println("Case " + c + ":");
  218.             process(vamps, mortals, mirrorDir, mirrorStart, mirrorEnd, biggestX, biggestY);
  219.  
  220.             v = scan.nextInt();
  221.             o = scan.nextInt();
  222.             m = scan.nextInt();
  223.         }
  224.     }
  225.  
  226.     public static void main(String[] args) throws Exception
  227.     {
  228.         new G().doIt();
  229.     }
  230. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement