PAT 1053. Path of Equal Weight

题目:http://pat.zju.edu.cn/contests/pat-a-practise/1053

题解:

给一棵树和各个树结点的权重,问哪些从根到叶子的权重和等于K。

深搜枚举所有可能即可。

代码:

#include<cstdio>
#include<cstring>
#include<cmath>
#include<string>
#include<vector>
#include<map>
#include<set>
#include<queue>
#include<algorithm>
using namespace std;
#define INF 0x6fffffff
#define MAX 105
vector<int> link[MAX];
vector<int> path;
int weight[MAX];
bool flag[MAX];
int n,m,s;
void dfs(int weit,int idx)
{
    int len;
    weit+=weight[idx];
    if(weit>s) return;//如果权重和大于要求,返回
    else if(weit==s&&link[idx].size()==0)
    {//如果权重和等于要求且当前结点无子树
        path.push_back(weight[idx]);
        printf("%d",path[0]);
        len=path.size();
        for(int i=1;i<len;++i)
            printf(" %d",path[i]);
        printf("\n");
        path.pop_back();
    }
    else if(weit<s&&link[idx].size()>0)
    {
        int maxm,maxIdx=0;
        path.push_back(weight[idx]);
        for(;maxIdx!=-1;)
        {
            maxm=maxIdx=-1;
            len=link[idx].size();
            for(int i=0;i<len;++i)
            {
                if(flag[link[idx][i]]==false&&weight[link[idx][i]]>maxm)
                {
                    maxIdx=link[idx][i];
                    maxm=weight[link[idx][i]];
                }
            }
            if(maxIdx!=-1)
            {
                flag[maxIdx]=true;
                dfs(weit,maxIdx);
            }
        }
        flag[idx]=true;
        path.pop_back();
    }
    return;
}
int main()
{
    int a,b,k;
    scanf("%d%d%d",&n,&m,&s);
    memset(flag,false,sizeof(flag));
    for(int i=0;i<n;++i)
        scanf("%d",weight+i);
    for(int i=0;i<m;++i)
    {
        scanf("%d%d",&a,&k);
        for(int j=0;j<k;++j)
        {
            scanf("%d",&b);
            link[a].push_back(b);
        }
    }
    dfs(0,0);
    return 0;
}

来源: http://blog.youkuaiyun.com/acm_ted/article/details/20801651


你提供的 `makeConstraints()` 方法是使用 **SnapKit**(Swift 的自动布局库)为 `HomeViewController` 中的各个 UI 组件设置约束。 你现在想添加一个新的模块 —— **事件中心(Event Center)**,并且已经创建了对应的控制器(比如 `eventCenterController`),现在需要在 `makeConstraints()` 中为其视图添加正确的 Auto Layout 约束。 --- ## ✅ 目标 > 为 `eventCenterController.view` 添加与其它页面一致的布局约束: - 顶部对齐到 `tabControl.snp.bottom` - 底部、左、右对齐父容器 `view` - 和 `liveView`、`playback` 等页面共用同一区域 --- ## ✅ 步骤一:确保已有 `eventCenterController` 成员变量 确认你在类中声明了: ```swift private var eventCenterController = TPGuardEventCenterController() // 或其他命名 ``` 如果没有,请先添加。 --- ## ✅ 步骤二:在 `makeConstraints()` 中添加 `eventCenterController.view` 的约束 修改你的 `makeConstraints()` 方法,在最后加入这一段: ```swift eventCenterController.view.snp.makeConstraints { make in make.top.equalTo(tabControl.snp.bottom) make.bottom.leading.trailing.equalTo(view) } ``` 📌 完整更新后的代码如下: ```swift override func makeConstraints() { super.makeConstraints() guard let tabControl = tabControl else { return } toolBar.snp.makeConstraints { make in make.top.leading.trailing.equalTo(view) make.height.equalTo(56) } seperatorView.snp.makeConstraints { make in make.top.equalTo(toolBar.snp.bottom) make.leading.trailing.equalTo(view) make.height.equalTo(1) } tabBar.snp.makeConstraints { make in make.top.equalTo(seperatorView.snp.bottom) make.leading.trailing.equalTo(view) make.height.equalTo(42) } homeButton.snp.makeConstraints { make in make.leading.top.bottom.equalTo(tabBar) make.width.equalTo(64) } updateTabConstraints() // 所有子页面的约束:共享同一显示区域 homeMenuViewController.view.snp.makeConstraints { make in make.top.equalTo(tabControl.snp.bottom) make.bottom.leading.trailing.equalTo(view) } homeLiveViewController.view.snp.makeConstraints { make in make.top.equalTo(tabControl.snp.bottom) make.bottom.leading.trailing.equalTo(view) } homePlayBackViewController.view.snp.makeConstraints { make in make.top.equalTo(tabControl.snp.bottom) make.bottom.leading.trailing.equalTo(view) } homeDeviceManagementViewController.view.snp.makeConstraints { make in make.top.equalTo(tabControl.snp.bottom) make.bottom.leading.trailing.equalTo(view) } downloadCenterController.view.snp.makeConstraints { make in make.top.equalTo(tabControl.snp.bottom) make.bottom.leading.trailing.equalTo(view) } // 👇 新增:事件中心页面的约束 eventCenterController.view.snp.makeConstraints { make in make.top.equalTo(tabControl.snp.bottom) make.bottom.leading.trailing.equalTo(view) } } ``` --- ## ✅ 步骤三:将 `eventCenterController.view` 加入父视图 ⚠️ 注意:仅仅设置约束还不够!你还必须确保这个 view 已经被添加到父视图层级中。 通常在 `viewDidLoad()` 或类似初始化方法中执行: ```swift override func viewDidLoad() { super.viewDidLoad() // 必须先将所有子页面的 view 添加到主视图(但不显示) view.addSubview(homeMenuViewController.view) view.addSubview(homeLiveViewController.view) view.addSubview(homePlayBackViewController.view) view.addSubview(homeDeviceManagementViewController.view) view.addSubview(downloadCenterController.view) // 👇 新增:把事件中心页面也加进去 view.addSubview(eventCenterController.view) // ... 其他逻辑 } ``` 否则即使设置了约束,也不会生效(因为不在视图树中)。 --- ## ✅ 步骤四:切换页面时正确显示 当你调用 `goEventCenterModule()` 时,应确保: 1. 把 `eventCenterController` 设置给 `navigationController` 2. 隐藏其他页面(或通过 `replaceViewController` 自动处理) 例如: ```swift func goEventCenterModule() { if currentVC === eventCenterController { return } currentVC = eventCenterController navigationController.replaceViewController(eventCenterController) updateSelectedTab(.eventCenter) } ``` 如果你的 `HomeNavigationViewController` 支持 `replaceViewController(_:)`,它会自动管理子 view 的 `isHidden`。 --- ## 🔍 原理说明 | 为什么这样设计? | 解释 | |------------------|------| | 所有页面都铺满同一个区域 | 使用相同的 `top/bottom/leading/trailing` 约束 | | 只有一个页面可见 | 通过 `navigationController` 或手动 `isHidden` 控制 | | `tabControl` 是什么? | 很可能是 `TPBSegmentControl`,用来做 tab 切换,它的 `.snp.bottom` 是内容区起点 | --- ## ✅ 总结:你需要做的三件事 1. ✅ 在类中定义 `eventCenterController` 2. ✅ 在 `viewDidLoad()` 中将其 `view` 添加为子视图 3. ✅ 在 `makeConstraints()` 中为其添加与其他页面一致的 SnapKit 约束 ✅ 完成后,页面就能正常布局,配合跳转逻辑即可显示。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值