acgo题库
  • 首页
  • 题库
  • 学习
  • 天梯
  • 备赛

    竞赛

    • CSP-J/S
    • 蓝桥杯

    考级

    • GESP
    • CPA
    • 电子学会考级
  • 资讯
  • 竞赛
  • 讨论
  • 团队
  • 商城
登录
注册
题目详情提交记录(0)
  • 题解

    #include <bits/stdc++.h> using namespace std; #define endl '\n' const int N = 105; int n, m; // clear[i]: 第i个按钮把哪些灯强制关(置0) // setv[i]: 第i个按钮把哪些灯强制开(置1) int clearv[N], setv[N]; int dist[1100]; // 2^10=1024 个状态 int main() { // 注意:输入格式第一行 n,第二行 m(不是同一行) cin >> n >> m; for (int i = 0; i < m; i++) { for (int j = 0; j < n; j++) { int x; cin >> x; if (x == 1) clearv[i] |= (1 << j); // 开->关 else if (x == -1) setv[i] |= (1 << j); // 关->开 } } int S = (1 << n) - 1; // 初始:全开 memset(dist, -1, sizeof(dist)); queue<int> q; dist[S] = 0; q.push(S); while (!q.empty()) { int s = q.front(); q.pop(); if (s == 0) break; // 全关 for (int i = 0; i < m; i++) { // 先清掉要强制关的位,再置上要强制开的位 int ns = (s & ~clearv[i]) | setv[i]; if (dist[ns] == -1) { dist[ns] = dist[s] + 1; q.push(ns); } } } cout << dist[0] << endl; return 0; }

    userId_undefined
    未知
    模拟·模拟练习生倔强青铜冒泡宗师→排序元老
    2阅读
    0回复
    0点赞
暂无数据

提交答案之后,这里将显示提交结果~

首页