牛客_四个选项_C++题解

原题链接:链接

我的代码:

cpp 复制代码
#include<iostream>
#include<vector>
using namespace std;
int m,x,y;
int cnt[5];
bool same[13][13];
int ret;
vector<int> path;
bool isSame(int pos,int cur){
    for(int i = 1;i<pos;i++){
        if(same[pos][i]&&cur!=path[i]){
            return false;
        }
    }
    return true;
}
void dfs(int pos){
    if(pos>12){
        ret++;
        return;
    }
    for(int i = 1;i<=4;i++){
        if(cnt[i]==0)continue;
        if(!isSame(pos,i))continue;
        cnt[i]--;
        path.push_back(i);
        dfs(pos+1);
        cnt[i]++;
        path.pop_back();        
    }
}
int main(){
    for(int i = 1;i<=4;i++)cin>>cnt[i];
    cin>>m;
    while(m--){
        cin>>x>>y;
        same[x][y] = same[y][x] = true;
    }
    path.push_back(0);
    dfs(1);
    cout<<ret<<endl;
    return 0;
}

需要注意的地方:
1.path.push_back(0);这是一个占位符,path是一个变长数组,里面记录着一轮dfs时,在12个选项上填写的答案。我们想让pathi表示第i个位置填写的是哪个选项,从而做出是否符合要求的判断。所以path0没有意义,但是需要占位。

2.samexy = sameyx = t;注意:x和y位置答案要一样,意味着y和x位置答案也要一样。

3.isSame函数用来判断,第pos位置填写cur是否符合题目中的m个条件中的x位置和y位置答案要一样,我们封装了这样的函数进行判断,有了path数组便可以详细记录是否满足它的要求。每一轮dfs完成后都会pop_back();所以path数组详细记录了一次dfs下去,12个选项中填写的答案。

4.cnt5数组中,cnti代表在i 还有多少个,比如cnt2==5;表示B选项还有5个没有填写进去。

5.sameij代表第i个题目和第j个题目的答案要一样。

相关推荐
Navigator_Z2 小时前
LeetCode //C - 1089. Duplicate Zeros
c语言·算法·leetcode
cany10002 小时前
C++ -- 可变参数模板
c++
不会C语言的男孩3 小时前
C++ Primer 第2章:变量和基本类型
开发语言·c++
云泽8085 小时前
C++ 可调用对象通关指南:深度解析 Lambda 表达式、function 包装器与 bind 绑定器
开发语言·c++·算法
Tri_Function5 小时前
简单图论大学习
c++
语戚5 小时前
力扣 3161. 块放置查询:线段树解法(Java 实现)
java·算法·leetcode·面试·线段树·力扣·
lqqjuly6 小时前
C++ 完整知识体系—从基础语法到现代 C++23 的系统性总结
c++·c++23
王老师青少年编程6 小时前
信奥赛C++提高组csp-s之FHQ Treap
c++·csp·平衡树·信奥赛·csp-s·提高组·fhq treap
8Qi87 小时前
LeetCode 23. 合并 K 个升序链表 —— 小顶堆(PriorityQueue)
数据结构·算法·leetcode·链表·
QiLinkOS8 小时前
《打破“用爱发电”:一种基于 Gitee 与时间戳的开源权益分配机制探索》
c语言·数据结构·c++·科技·算法·gitee·开源