arms

工厂模式

拥有回忆 提交于 2020-03-04 00:06:49
例子1:开发一个类似植物大战僵尸的游戏,有三种不同的植物:绿豆,蓝冰,坚果   分析:可以使用简单工厂模式:因为每个植物都需使用new()方法创建实例,所以我们将所以不同的植物实现一个名叫植物的接口,然后在在工厂类中判断所需创建的植物,若要创建指定的植物只需调用工厂类中的createPlant方法即可 package org.imooc.factory; import org.imooc.component.Arms; import org.imooc.component.Hair; import org.imooc.component.Shell; import org.imooc.plant.*; public class SimpleFactory { /** * 创建植物对象的静态方法 */ public static Plant createPlant(String name) { Plant plant = null; if(PlantNameConstant.BEAN_NAME.equals(name)) { plant = new Bean(); } else if (PlantNameConstant.ICE_NAME.equals(name)) { plant = new Ice(); } else if (PlantNameConstant.WALL_NAME

[Atcoder ARC103D]Robot Arms

寵の児 提交于 2019-12-03 12:59:16
题目大意: 平面上有$n$个点,要求你构造$m$条边(满足$m\leqslant40$),使得可以从原点到达给定的$n$个点(边必须平行于坐标轴)。并要求输出每一条边的方向,每条边必须都使用,无解输出$-1$。$n\leqslant1000$,点的坐标的绝对值$\leqslant10^9$,边长度$\leqslant10^{12}$ 题解: 因为所有的边必须使用,所以每一个点横纵坐标相加的奇偶性相同,不同就无解。发现若构造长度为$1,2,\cdots,2^n$的边,可以到达满足$|x|+|y|\leqslant2^{k+1}-1$且$|x|+|y|\equiv 1\pmod2$的所有点,若$|x|+|y|\equiv0\pmod2$就再加一条长度为$1$的边。并且发现$2^n>\sum\limits_{i=0}^{n-1}2^i$,故若从大到小考虑边,一定走横纵坐标中相差较多的一个方向。这样贪心枚举即可。 卡点: 没开$\mathrm{long\ long}$,没有修改坐标位置 C++ Code: #include <iostream> #include <algorithm> #include <cstdio> const int maxn = 1010, X[] = { 1, 0, -1, 0 }, Y[] = { 0, 1, 0, -1 }; int n, x[maxn],