Guest User

Untitled

a guest
Apr 16th, 2018
83
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 7.54 KB | None | 0 0
  1. import java.awt.*;
  2. import java.awt.event.*;
  3. import java.awt.image.*;
  4. import java.io.*;
  5. import java.util.*;
  6. import java.security.*;
  7. import javax.swing.*;
  8. import javax.imageio.*;
  9.  
  10. public class Tester {
  11. public BufferedImage visualize() {
  12. int WIDTH = BOX_SIZE + 40;
  13. int HEIGHT = BOX_SIZE + 40;
  14. BufferedImage bi = new BufferedImage(WIDTH, HEIGHT, BufferedImage.TYPE_INT_RGB);
  15. Graphics2D g2 = (Graphics2D)bi.getGraphics();
  16. g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
  17. g2.setColor(new Color(0xD3D3D3));
  18. g2.fillRect(0, 0, WIDTH, HEIGHT);
  19. g2.setColor(new Color(0xFFFFFF));
  20. g2.fillRect(20, 20, WIDTH - 40, HEIGHT - 40);
  21.  
  22. for (int i = 0; i < N; i++) {
  23. int wt = (dir[i] == 0 ? w[i] : h[i]);
  24. int ht = (dir[i] == 0 ? h[i] : w[i]);
  25. Color c = Color.getHSBColor((1.0f / (float)N) * (float)i, 1.0f, 0.95f);
  26. g2.setColor(c);
  27. g2.fillRect(20 + posX[i], 1020 - posY[i] - ht, wt, ht);
  28. g2.setColor(new Color(0x3F3F3F));
  29. g2.drawRect(20 + posX[i], 1020 - posY[i] - ht, wt, ht);
  30. }
  31.  
  32. g2.setStroke(new BasicStroke(2.0f));
  33. g2.drawLine(20, 1020 - MAX_POSY, 1020, 1020 - MAX_POSY);
  34.  
  35. //g2.setFont(new Font("Arial", Font.BOLD, 15));
  36. //FontMetrics fm = g2.getFontMetrics();
  37. //char[] ch = ("Score = " + MAX_POSY).toCharArray();
  38. //int x = BOX_SIZE / 2;
  39. //int y = 1020 - MAX_POSY - 5;
  40. //g2.drawChars(ch, 0, ch.length, x, y);
  41. return bi;
  42. }
  43. public class Visualizer extends JPanel implements WindowListener {
  44.  
  45. public void paint(Graphics g) {
  46.  
  47. try {
  48. int WIDTH = BOX_SIZE + 40;
  49. int HEIGHT = BOX_SIZE + 40;
  50. g.drawImage(image, 0, 0, WIDTH, HEIGHT, null);
  51. } catch (Exception e) {
  52. e.printStackTrace();
  53. }
  54. }
  55.  
  56. public Visualizer () {
  57. jf.addWindowListener(this);
  58. }
  59.  
  60. public void windowClosing(WindowEvent e) {
  61. if (proc != null) {
  62. try {
  63. proc.destroy();
  64. } catch (Exception ex) {
  65. ex.printStackTrace();
  66. }
  67. }
  68. System.exit(0);
  69. }
  70.  
  71. public void windowActivated(WindowEvent e) { }
  72. public void windowDeactivated(WindowEvent e) { }
  73. public void windowOpened(WindowEvent e) { }
  74. public void windowClosed(WindowEvent e) { }
  75. public void windowIconified(WindowEvent e) { }
  76. public void windowDeiconified(WindowEvent e) { }
  77.  
  78. }
  79.  
  80. /********************************************************************/
  81.  
  82. JFrame jf;
  83. Visualizer v;
  84. InputStream is;
  85. OutputStream os;
  86. Scanner sc;
  87. BufferedImage image;
  88.  
  89. static Process proc;
  90. static String fileName, exec;
  91. static boolean save, vis;
  92.  
  93. final int N = 400;
  94. final int RECT_MAX = 50, RECT_MIN = 5;
  95. final int BOX_SIZE = 1000;
  96. int [] h, w;
  97. int [] dir;
  98. int [] posX, posY;
  99. int MAX_POSY;
  100.  
  101. /********************************************************************/
  102.  
  103. public void generate (String seedStr) {
  104.  
  105. try {
  106. SecureRandom rnd = SecureRandom.getInstance("SHA1PRNG");
  107. long seed = Long.parseLong(seedStr);
  108. rnd.setSeed(seed);
  109.  
  110. w = new int[N];
  111. h = new int[N];
  112. for (int i = 0; i < N; i++) {
  113. w[i] = rnd.nextInt(RECT_MAX - RECT_MIN + 1) + RECT_MIN;
  114. h[i] = rnd.nextInt(RECT_MAX - RECT_MIN + 1) + RECT_MIN;
  115. }
  116. } catch (Exception e) {
  117. System.err.println("An exception occurred while generating test case.");
  118. e.printStackTrace();
  119. }
  120.  
  121. }
  122.  
  123. public double runTest (String seed) {
  124.  
  125. try {
  126. generate(seed);
  127. if (proc != null) try {
  128. getPermutation();
  129. boolean [][] used = new boolean[BOX_SIZE][BOX_SIZE];
  130. for (int i = 0; i < N; i++) {
  131. int a = (dir[i] == 0 ? w[i] : h[i]);
  132. int b = (dir[i] == 0 ? h[i] : w[i]);
  133. for (int x = posX[i]; x < posX[i] + a; x++) {
  134. for (int y = posY[i]; y < posY[i] + b; y++) {
  135. if (used[x][y]) {
  136. System.err.println("There are overlapping rectangles.");
  137. return -1;
  138. }
  139. if (x < 0 || y < 0 || x >= BOX_SIZE || y >= BOX_SIZE) {
  140. System.err.println("There is a rectangle which does not fit in the box.");
  141. return -1;
  142. }
  143. used[x][y] = true;
  144. }
  145. }
  146. }
  147. } catch (Exception e) {
  148. System.err.println("Failed to get result.");
  149. return -1;
  150. }
  151. } catch (Exception e) {
  152. e.printStackTrace();
  153. return -1;
  154. }
  155.  
  156. MAX_POSY = 0;
  157. for (int i = 0; i < N; i++) {
  158. int y = posY[i] + (dir[i] == 0 ? h[i] : w[i]);
  159. MAX_POSY = Math.max(MAX_POSY, y);
  160. }
  161.  
  162. if (vis || save) {
  163. try {
  164. image = visualize();
  165. if (save) {
  166. ImageIO.write(image, "png", new File(fileName +".png"));
  167. }
  168. } catch (Exception e) {
  169. e.printStackTrace();
  170. }
  171. }
  172. if (vis) {
  173. jf.setSize(BOX_SIZE + 40, BOX_SIZE + 40);
  174. jf.setVisible(true);
  175. }
  176.  
  177. return MAX_POSY;
  178. }
  179.  
  180. private void getPermutation () throws IOException {
  181. StringBuffer sb = new StringBuffer();
  182. sb.append(N).append('\n');
  183. for (int i = 0; i < N; ++i) {
  184. sb.append(w[i]).append(' ');
  185. sb.append(h[i]).append('\n');
  186. }
  187. os.write(sb.toString().getBytes());
  188. os.flush();
  189.  
  190. dir = new int[N];
  191. posX = new int[N];
  192. posY = new int[N];
  193. for (int i = 0; i < N; ++i) {
  194. dir[i] = sc.nextInt();
  195. posX[i] = sc.nextInt();
  196. posY[i] = sc.nextInt();
  197. }
  198. }
  199.  
  200. public Tester (String seed) {
  201. if (vis) {
  202. jf = new JFrame();
  203. v = new Visualizer();
  204. jf.getContentPane().add(v);
  205. }
  206. if (exec != null) {
  207. try {
  208. Runtime rt = Runtime.getRuntime();
  209. proc = rt.exec(exec);
  210. os = proc.getOutputStream();
  211. is = proc.getInputStream();
  212. sc = new Scanner(is);
  213. } catch (Exception e) {
  214. e.printStackTrace();
  215. }
  216. }
  217. System.out.println("Score = " + runTest(seed));
  218. if (proc != null) {
  219. try {
  220. proc.destroy();
  221. } catch (Exception e) {
  222. e.printStackTrace();
  223. }
  224. }
  225. }
  226.  
  227. public static void main (String[] args) {
  228. String seed = "1";
  229. for (int i = 0; i < args.length; ++i) {
  230. if (args[i].equals("-seed")) {
  231. seed = args[++i];
  232. } else if (args[i].equals("-exec")) {
  233. exec = args[++i];
  234. } else if (args[i].equals("-vis")) {
  235. vis = true;
  236. } else if (args[i].equals("-save")) {
  237. save = true;
  238. }
  239. }
  240. fileName = seed;
  241. Tester test = new Tester(seed);
  242. }
  243.  
  244. }
Add Comment
Please, Sign In to add comment