Java 第十一屆 藍橋杯 省模擬賽 小明植樹(DFS)

小明植樹

題目
問題描述
java

小明和朋友們一塊兒去郊外植樹,他們帶了一些在本身實驗室精心研究出的小樹苗。
  小明和朋友們一共有 n 我的,他們通過精心挑選,在一塊空地上每一個人挑選了一個適合植樹的位置,總共 n 個。他們準備把本身帶的樹苗都植下去。
  然而,他們遇到了一個困難:有的樹苗比較大,而有的位置挨太近,致使兩棵樹植下去後會撞在一塊兒。
  他們將樹當作一個圓,圓心在他們找的位置上。若是兩棵樹對應的圓相交,這兩棵樹就不適合同時植下(相切不受影響),稱爲兩棵樹衝突。
  小明和朋友們決定先合計合計,只將其中的一部分樹植下去,保證沒有互相沖突的樹。他們同時但願這些樹所能覆蓋的面積和(圓面積和)最大。



markdown

輸入格式spa

輸入的第一行包含一個整數 n ,表示人數,即準備植樹的位置數。
  接下來 n 行,每行三個整數 x, y, r,表示一棵樹在空地上的橫、縱座標和半徑。
.net

輸出格式code

輸出一行包含一個整數,表示在不衝突下能夠植樹的面積和。因爲每棵樹的面積都是圓周率的整數倍,請輸出答案除以圓周率後的值(應當是一個整數)。blog

樣例輸入get

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





it

樣例輸出class

12import

評測用例規模與約定

對於 30% 的評測用例,1 <= n <= 10;
  對於 60% 的評測用例,1 <= n <= 20;
  對於全部評測用例,1 <= n <= 30,0 <= x, y <= 1000,1 <= r <= 1000。

package 省模擬賽;

import java.util.Scanner;

public class 植樹2 {
	public static boolean[][] bool = new boolean[31][31];
	static boolean[] vis = new boolean[31];
	public static int[] x = new int[31];
	public static int[] y = new int[31];
	public static int[] r = new int[31];
	public static int n = 0, max = -1;

	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		n = sc.nextInt();
		for (int i = 1; i <= n; i++) {
			x[i] = sc.nextInt();
			y[i] = sc.nextInt();
			r[i] = sc.nextInt();
		}
		for (int i = 1; i <= n; i++) {
			for (int j = i + 1; j <= n; j++) {
				boolean bo = ((x[i] - x[j]) * (x[i] - x[j]) + (y[i] - y[j]) * (y[i] - y[j]) > (r[i] + r[j])
						* (r[i] + r[j]));
				bool[i][j] = bo;
				bool[j][i] = bo;
			}
		}
		sc.close();
		dfs(1);
		System.out.println(max);
	}

	public static void dfs(int step) {
		if (step > n) {
			int sum = 0;
			for (int i = 1; i <= n; i++) {
				if (vis[i]) {
					sum += (r[i] * r[i]);
				}
			}
			max = Math.max(sum, max);

			return;
		}

		vis[step] = false;
		dfs(step + 1);
		for (int i = 1; i < step; i++) {
			if (vis[i] && !bool[i][step]) {
				return;
			}

		}
		vis[step] = true;
		dfs(step + 1);
	}

}
發佈了1833 篇原創文章 · 獲贊 3萬+ · 訪問量 487萬+
相關文章
相關標籤/搜索