zoukankan      html  css  js  c++  java
  • 回溯算法

    小明植树
    题目
    问题描述

    小明和朋友们一起去郊外植树,他们带了一些在自己实验室精心研究出的小树苗。
      小明和朋友们一共有 n 个人,他们经过精心挑选,在一块空地上每个人挑选了一个适合植树的位置,总共 n 个。他们准备把自己带的树苗都植下去。
      然而,他们遇到了一个困难:有的树苗比较大,而有的位置挨太近,导致两棵树植下去后会撞在一起。
      他们将树看成一个圆,圆心在他们找的位置上。如果两棵树对应的圆相交,这两棵树就不适合同时植下(相切不受影响),称为两棵树冲突。
      小明和朋友们决定先合计合计,只将其中的一部分树植下去,保证没有互相冲突的树。他们同时希望这些树所能覆盖的面积和(圆面积和)最大。

    输入格式

    输入的第一行包含一个整数 n ,表示人数,即准备植树的位置数。
      接下来 n 行,每行三个整数 x, y, r,表示一棵树在空地上的横、纵坐标和半径。

    输出格式

    输出一行包含一个整数,表示在不冲突下可以植树的面积和。由于每棵树的面积都是圆周率的整数倍,请输出答案除以圆周率后的值(应当是一个整数)。

    样例输入

    6
    1 1 2
    1 4 2
    1 7 2
    4 1 2
    4 4 2
    4 7 2

    样例输出

    12

    评测用例规模与约定

    对于 30% 的评测用例,1 <= n <= 10;
      对于 60% 的评测用例,1 <= n <= 20;
      对于所有评测用例,1 <= n <= 30,0 <= x, y <= 1000,1 <= r <= 1000。

     1 import java.util.Scanner;
     2 
     3 public class Main{
     4     static class Node{
     5         int x;
     6         int y;
     7         int r;
     8     }
     9     static boolean[] vis = new boolean[31];
    10     static boolean[][] bool = new boolean[31][31];
    11     static Node[] node = new Node[31];
    12     static int n = 0;
    13     static int max = -1;
    14     public static void main(String args[]){
    15         Scanner sc = new Scanner(System.in);
    16         n = sc.nextInt();
    17         for(int i=1;i<=n;i++){
    18             node[i] = new Node();
    19             node[i].x = sc.nextInt();
    20             node[i].y = sc.nextInt();
    21             node[i].r = sc.nextInt();
    22         }
    23         sc.close();
    24         for(int i=1;i<=n;i++){
    25             for(int j=i+1;j<=n;j++){
    26                 bool[i][j] = ((node[i].x-node[j].x)*(node[i].x-node[j].x) + (node[i].y-node[j].y)
    27                         *(node[i].y-node[j].y) > (node[i].r+node[j].r)*(node[i].r+node[j].r));
    28                 bool[j][i] = bool[i][j];
    29             }
    30         }
    31         dfs(1);
    32         System.out.println(max);
    33     }
    34         
    35     private static void dfs(int step){
    36         if(step > n){
    37             int sum = 0;
    38             for(int i=1;i<=n;i++){
    39                 if(vis[i]){
    40                     sum += (node[i].r * node[i].r);
    41                 }
    42             }
    43             max = Math.max(sum, max);
    44             return;
    45         }
    46         vis[step] = false;
    47         dfs(step + 1);
    48         
    49         //下面是左剪枝,就是说前面结点选中且当前结点与前面结点有冲突的时候,当前结点不应该被选择,后面的就不应该继续执行
    50         for (int i = 1; i < step; i++) {    
    51             if (vis[i] && !bool[i][step]) {
    52                 return;
    53             }
    54         }
    55         vis[step] = true;
    56         dfs(step + 1);
    57     }
    58 }
    View Code
  • 相关阅读:
    LeetCode 453 Minimum Moves to Equal Array Elements
    LeetCode 112 Path Sum
    LeetCode 437 Path Sum III
    LeetCode 263 Ugly Number
    Solutions and Summay for Linked List Naive and Easy Questions
    AWS–Sysops notes
    Linked List
    All About Linked List
    datatable fix error–Invalid JSON response
    [转]反编译c#的相关问题
  • 原文地址:https://www.cnblogs.com/AIchangetheworld/p/12741295.html
Copyright © 2011-2022 走看看