UVALive4922_Queen Collision

http://livearchive.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=32&page=show_problem&problem=2923


一开始是想了暴力,即对于每个皇后找到与之冲突的所有皇后,显然,O(n^2)果断是TLE的(皇后的总数不会超过n),然后就要想办法优化,想了排序,想了对于每个点当找到超过8个冲突时可停止查找(因为每个皇后最多与其他8个产生冲突)。。反正就是想了挺久的,走上了这条不归路。。。。
最后的做法,不是我想出来的,是一个与我一开始的想法完全不同的思考方向,不是找每个皇后的所有冲突,而是找所有可能发生冲突的地方有多少个皇后,即计算每一行每一列每条对角线上一共有多少个皇后,如果有k个皇后,就会有k-1对冲突(因为冲突的皇后之间必须无障碍)。这种做法,O(n),而且也不用保存每个皇后的位置,代码也很短。
反思:为什么我总是把问题复杂化。。。。。


代码:
row[x] 表示第x行有几个皇后
col[y] 表示第y列有几个皇后
dia1[x-y] 表示主对角线(把负数部分移到正数部分的后面)

dia2[x+y] 表示副对角线


代码:

#include <cstdio>
#include <cstring>
using namespace std;

const int N = 30000 * 2 + 10;
int row[N/2], col[N/2], dia1[N], dia2[N];

int main()
{
    //freopen("a", "r", stdin);
    //freopen("b", "w", stdout);

    int n, g;
    while (scanf("%d", &n) != EOF && n)
    {
        memset(row, 0, sizeof(row));
        memset(col, 0, sizeof(col));
        memset(dia1, 0, sizeof(dia1));
        memset(dia2, 0, sizeof(dia2));
        scanf("%d", &g);
        int k, x, y, s, t, tmpx, tmpy;
        while (g--)
        {
            scanf("%d%d%d%d%d", &k, &x, &y, &s, &t);
            for (int i = 0; i < k; i++)
            {
                tmpx = x + i * s;
                tmpy = y + i * t;
                row[tmpx]++;
                col[tmpy]++;
                int tmp = tmpx - tmpy;
                if(tmp < 0) tmp += 2 * (n-1) + 1;
                dia1[tmp]++;
                dia2[tmpx+tmpy]++;
            }
        }
        int sum = 0;
        for (int i = 1; i <= n; i++)
        {
            if (row[i]) sum += row[i] - 1;
            if (col[i]) sum += col[i] - 1;
        }
        for (int i = 0; i <= n + n; i++)
        {
            if (dia1[i]) sum += dia1[i] - 1;
            if (dia2[i]) sum += dia2[i] - 1;
        }
        printf("%d\n", sum);
    }
}


### OCS2中的自我碰撞配置与解决方案 在机器人学领域,OCS2(Optimal Control Software Suite 2)是一个用于实时最优控制的强大工具。然而,在涉及复杂机械臂或其他多关节系统的应用中,自我碰撞检测和规避是一项重要挑战。 #### 自我碰撞的概念 自我碰撞是指一个多体系统内的不同部分之间发生的物理接触或干涉现象[^1]。这种碰撞可能导致硬件损坏或者任务失败,因此需要通过软件层面的规划来避免此类情况的发生。 #### 配置方法 为了实现有效的自我碰撞管理,可以采用以下几种策略: 1. **几何建模** 使用精确的几何模型表示机器人的各个部件是非常重要的第一步。这通常涉及到定义每一段连杆以及其关联的旋转和平移自由度。对于这些组件之间的相对位置关系,则可以通过D-H参数表征出来。 2. **距离场计算** 距离场是一种预处理技术,它能够快速评估任意两点间的最小安全间距。预先构建好整个工作空间的距离图可以帮助控制器迅速判断当前状态是否存在潜在危险区域,并及时调整轨迹以避开它们。 3. **约束优化求解器集成** 将自我碰撞条件作为额外的不等式约束加入到原有的动力学方程组当中去考虑。这样做的好处是可以让算法自动寻找满足所有限制条件下最佳动作序列的同时也确保不会发生内部结构件相互干扰的情况。 4. **基于采样的路径规划** 如果上述解析方式难以适用于特别复杂的场景下的话,那么还可以尝试利用随机树生长法(RRT*)之类的全局搜索型算法来进行探索性的避障操作。这类方法虽然耗时较长但胜在其通用性强且适应范围广。 ```cpp // Example of setting up a collision checker in C++ #include <ocs2_collision/collision_checker.h> CollisionChecker::Ptr createSelfCollisionChecker(const std::vector<Link>& links){ CollisionChecker::Ptr checker(new CollisionChecker()); for(auto& link : links){ checker->addLink(link); } return checker; } ``` 以上代码片段展示了如何创建一个简单的自碰撞性能验证对象实例的过程。具体来说就是遍历传入的所有连接单元并将之逐一注册至对应的处理器之中以便后续调用时候完成必要的检验逻辑运算功能。 #### 解决方案总结 综上所述,针对OCS2框架下的自我碰撞问题可以从多个角度出发寻求妥善处置办法。无论是依靠精准的数据描述还是借助先进的数值分析手段都能够有效提升整体性能表现水平从而更好地服务于实际工程需求之上。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值